Я пытаюсь изучить основы, я думаю, что объявление char [] и присвоение ему строки сработает. Благодарность
int size = 100;
char str[size];
str = "\x80\xbb\x00\xcd";
выдает ошибку "несовместимые типы в присвоении". что случилось? Благодарность
Я пытаюсь изучить основы, я думаю, что объявление char [] и присвоение ему строки сработает. Благодарность
int size = 100;
char str[size];
str = "\x80\xbb\x00\xcd";
выдает ошибку "несовместимые типы в присвоении". что случилось? Благодарность
Вы можете использовать строковый литерал для инициализации массива char, но вы не можете назначить массив char (как и любой другой массив). OTOH, вы можете назначить указатель, поэтому будет разрешено следующее:
char *str;
str = "\x80\xbb\x00\xcd";
const char* при работе со строковыми литералами.
- person Matthew; 27.09.2010
=. На самом деле нет серьезной причины почему - просто язык требует, чтобы вы использовали другой механизм (memcpy() в целом) для этого.
- person caf; 27.09.2010
На самом деле это одна из самых сложных частей изучения языка программирования .... str - это массив, то есть часть памяти (размер, умноженная на символ, поэтому размер символов), которая была зарезервирована и помечена как str. str [0] - это первый символ, str [1] - второй ... str [size-1] - последний. str сама по себе, без указания какого-либо символа, является указателем на зону памяти, которая была создана, когда вы сделали
char str[size]
Как ясно сказал Джерри, в C вы не можете инициализировать массивы таким образом. Вам нужно скопировать из одного массива в другой, поэтому вы можете сделать что-то вроде этого
strncpy(str, "\x80\xbb\x00\xcd", size); /* Copy up to size characters */
str[size-1]='\0'; /* Make sure that the string is null terminated for small values of size */
Подводя итог: очень важно различать указатели, области памяти и массив.
Удачи - я почти уверен, что за меньшее время, чем вы думаете, вы освоите эти концепции :)
str не является указателем. Сделайте sizeof str, чтобы увидеть разницу. Самый простой способ увидеть, что str "незаметно" преобразуется в указатель на "правой стороне" выражений, но не слева от оператора присваивания.
- person Jens Gustedt; 27.09.2010
Char-array может быть неявно преобразован в char * при использовании как Rvalue, но не при использовании как Lvalue - вот почему присвоение не сработает.
Вы не можете назначить массив contents с помощью =operator. Это просто факт дизайна языка C. Вы можете инициализировать массив в объявлении, например
char str[size] = "\x80\xbb\x00\xcd";
но эта операция отличается от задания. Обратите внимание, что в этом случае в конец строки будет добавлен дополнительный '\ 0'.
Предупреждение о «несовместимых типах» возникает из-за того, как язык обрабатывает выражения массива. Прежде всего, строковые литералы хранятся в виде массивов char со статическим размером (то есть они существуют в течение всего времени существования программы). Таким образом, тип строкового литерала "\ x80 \ xbb \ x00 \ xcd" - "4 5-элементный массив char". Однако в большинстве случаев выражение типа массива будет неявно преобразовано («распадаться») из типа «N-элементный массив T» в «указатель на T», и значением выражения будет адрес первого элемент в массиве. Итак, когда вы написали заявление
str = "\x80\xbb\x00\xcd";
тип литерала был неявно преобразован из "4 5-элементного массива char" в "указатель на char", но целью присвоения является тип "100-элементный массив char", и типы несовместимы (помимо того, что выражение массива не может быть целью оператора =).
Чтобы скопировать содержимое одного массива в другой, вам придется использовать библиотечную функцию, такую как memcpy, memmove, strcpy и т. Д. Кроме того, для правильной работы strcpy исходная строка должна оканчиваться нулем.
Изменить на комментарий R ниже, я вычеркнул самые глупые разделы своего ответа.
"\x80\xbb\x00\xcd" уже содержит завершающий 0, поэтому неправильно говорить о добавлении последнего 0 при использовании его в качестве инициализатора. Кроме того, частично инициализированный объект в C всегда имеет оставшуюся часть объекта, заполненную нулями. Это не относится к строкам.
- person R.. GitHub STOP HELPING ICE; 27.09.2010
Чтобы назначить строковый литерал массиву str, вы можете использовать функцию копирования строки strcpy.
str - это имя массива. Имя массива - это адрес 0-го элемента. Следовательно, str является константой указателя. Вы не можете изменить значение константы указателя, так же как вы не можете изменить константу (например, вы не можете сделать 6 = 5).
str не всегда рассматривается как указатель. Вот соответствующий параграф (раздел 6.3.2.1, параграф 3) За исключением случаев, когда это операнд оператора sizeof или унарного оператора &, или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип '' массив типа '' преобразуется в выражение с типом '' указатель на тип '', которое указывает на начальный элемент объекта массива и не является lvalue. Если объект массива имеет класс хранения регистров, поведение не определено. Акцент мой.
- person John Bode; 27.09.2010