640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
|||||||||||
1 | |||||||||||
char *s или char s[]17.08.2011, 15:52. Показов 24119. Ответов 16
0
|
17.08.2011, 15:52 | |
Ответы с готовыми решениями:
16
Преобразование char в char* или разделить на две строки Приведение массива char[] (или char* ) в LPCTSTR Char unsigned char signed char длинна Кааак string[] в char[][] или char[] |
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.08.2011, 16:07 | 4 |
Выражение "1111" имеет тип const char *, вы же пытаетесь присвоить его переменной типа char *, отсюда предупреждение. Падает программа из-за memmove, поскольку, как уже было сказано, "1111" - константная строка и её нельзя изменить.
0
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
|
17.08.2011, 16:32 [ТС] | 5 |
Если s1 указатель на не-константу, то почему вообще возможна запись?
char *s1="что-то там"; И почему падает memcpy? Ну передали две ссылки на a и b, сказали сколько байт надо скопировать, а падать зачем?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.08.2011, 16:34 | 6 |
Неявное преобразование типа.
Потому что константы неизменны по определению.
0
|
Заблокирован
|
||||||
17.08.2011, 16:41 | 7 | |||||
Во-втором случае вы инициализируете указатель значением, который указывает на строковый литерал. Согласно стандарту С++ строковый литерал имеет тип const char[], то есть массив констатных символов. Стандарт оставляет способ размещения литералов на усмотрение производлителей компиляторов. Например, совпадающие по значению литералы, то есть дублирующиеся литералы могут храниться в виде одного литерала. В свыязи с этим представьте себе такой код
Во-вторых, компилятор может размещать строковые литералы в памяти, предназначенной только для чтения. И тогда, как в вашем случае, произойдет аварийное завершении программы при попытки изменить строковый литерал. В первом же случае, когда вы объявляете массив, то нимкакого строкового литерала в памяти не создается. Создается массив, который инициализируется значением выражениям инициализации. То есть в данном случае char s1[]="1111"; создается массив s1, элементы которого получают значения '1', '1', '1', '1', '\0'. А сам строковый литерал, используемый в качестве выражения инициализации в памяти программы не сохраняется.
0
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
|
17.08.2011, 17:06 [ТС] | 8 |
Не имеет значения то на что указывает ссылка - константа или не-константа.
Ссылка указывает на участок памяти, и в программе этот участок никак не маркируется. Если ссылка на константу, то сам компилятор не должен разрешать выражения меняющие значение. При запуске программы по ссылке s1 находится пять байтов "1111\0". То что данные взяты из константного выражения уже не имеет значения - s1 является указателем на char. Добавлено через 4 минуты Сыроежка, пожалуйста, читайте внимательно, а не по диагонали через пять строк.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
17.08.2011, 17:08 | 9 |
skvor, я не понимаю, чего вы добиваетесь? Вам уже сказали причину - строковый литерал располагается в read-only памяти, менять такую память запрещено, попытка приводит к печальным последствиям. Вы хоть указатель на int установите указывать на эту read-only память, результат будет всё тем же плачевным. Важно не то, какой тип имеет указатель, а то, какой тип имеет объект, на который этот указатель указывает.
Добавлено через 1 минуту И не надо ваших предположений по поводу того, что компилятор должен делать и чего не должен. Они могут оказаться чрезвычайно далеки от истины.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
17.08.2011, 17:16 | 10 |
Если внимательно посмотреть на предупреждение, то можно увидеть там слово deprecated. Это наследие старины глубокой, скорее всего даже из языка Си пришедшее. Это неявное преобразование рады бы запретить, но если делать это сразу, то сломается довольно много старого кода. Вы же всегда можете включить опцию компилятора, которая считает предупреждения ошибками, тем более что часто это так и есть, как и в данном случае.
2
|
Заблокирован
|
|||||||||||
17.08.2011, 20:55 | 11 | ||||||||||
Я совершенно не понял, что вас не устроило в моем ответе! Не можете ли разъяснить, чем вы не довольны?!
Добавлено через 5 минут На самом деле это не неявное преобразование, а явное! Я понимаю, что вы мне сейчас сделаете ссылку на приложение D стандарта, где говорится о неячвном преобразовании. Но на самом деле в другом месте стандарта говорится, что такое преобразование может иметь место только при явном преобразовании! Это одно из тех мест стандарта, где стандарт сам себе противоречит. Что значит "явное преобразование"? Это преобразование вида
При неявном преобразовании строковый литерал как раз преобразуется в выражениях (кроме ссылок на них) в
0
|
grizlik78
|
17.08.2011, 21:00
#12
|
1
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|||||||||||
17.08.2011, 21:43 | 14 | ||||||||||
Преобразование там, конечно же, неявное, что ж с этим поделать-то? Почему же на основании чьих-то заблуждений я должен выкидывать слово из предложения? Но если читателю оно не по душе, он может смело его выкинуть, смысл от этого нисколечко не изменится.
Кроме того, говоря "Это неявное преобразование" я подразумевал не только выражение типа
0
|
Заблокирован
|
|
17.08.2011, 21:49 | 15 |
Второе выражение тоже является явным преобразованием так как параметры вычисляются на основе оператора присваивания. То есть этот пример полностью аналогичен первому, если у функции параметр объявлен как char *.
Как я уже ранее отметил, в этом вопросе в стандарте присутствует путаница. Я все же согласен с тем, что когда явно указывается тип результата, как в операторе присваивания, или в объявлении, то это явное преобразование.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
17.08.2011, 21:50 | 16 |
Хотелось бы увидеть ссылку на то место в стандарте, которое позволяет трактовать это таким образом.
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
18.08.2011, 03:53 | 17 | |||||
Сообщение от Сыроежка
операция присваивания имеет ряд ограничений C89 (draft) 3.3.16.1 Simple assignment
0
|
18.08.2011, 03:53 | |
18.08.2011, 03:53 | |
Помогаю со студенческими работами здесь
17
Ошибка: "char *concat(char *,.)": невозможно преобразовать аргумент 1 из "const char [4]" в "char *" (std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь( Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |