Устранена аналогичная проблема в IBM RAD 7.5, выбрав:
При инициализации массива C позволяет Вам заполнять его значениями. Так
char s[100] = "abcd";
в основном то же как [1 113]
int s[3] = { 1, 2, 3 };
, но оно не позволяет Вам делать уроки, так как s
массив и не свободный указатель. Значение [1 114]
s = "abcd"
должно присвоить значение указателя abcd
к s
, но Вы не можете измениться s
с тех пор, ничто не будет указывать на массив.
Это может и действительно работать, если s
char*
- указатель, который может указать на что-либо.
, Если Вы хотите скопировать строку простое использование strcpy
.
Нет такой вещи как "строка" в C. В C строки являются одномерным массивом char
, завершенный нулевым символом \0
. Так как Вы не можете присвоить массивы в C, Вы не можете присвоить строки также. Литерал "привет" является синтаксическим сахаром для const char x[] = {'h','e','l','l','o','\0'};
, корректный путь был бы:
char s[100];
strncpy(s, "hello", 100);
или еще лучше:
#define STRMAX 100
char s[STRMAX];
size_t len;
len = strncpy(s, "hello", STRMAX);
Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.
Обратите внимание, что можно все еще сделать:
s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';
s[5] = '\0';
Чтобы подробно остановиться ответ Sparr
, Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.
Думают о нем как это:
Предполагают, что существует 2 функции, вызванные InitializeObject
, и AssignObject
. Когда компилятор видит thing = value
, он смотрит на контекст и называет один InitializeObject
при создании нового thing
. Если Вы не, это вместо этого звонит AssignObject
.
Обычно это прекрасно, поскольку InitializeObject
и AssignObject
обычно ведут себя тот же путь. Кроме тех случаев, когда, имея дело с массивами символов (и несколько других пограничных случаев), в этом случае они ведут себя по-другому. Почему делают это? Хорошо это - целое другое сообщение, включающее стек по сравнению с "кучей" и т. д. и т. п.
пз: Как в стороне, думая это таким образом также поможет Вам понять конструкторов копии и другие такие вещи, если Вы когда-нибудь будете рисковать в C++
1 char s[100];
2 s = "hello";
В примере Вы, если, s на самом деле инициализируется в строке 1, не строке 2. Даже при том, что Вы не присваивали ему значение явно в этой точке, компилятор сделал. В строке 2, Вы выполняете операцию присвоения, и Вы не можете присвоить один массив символов к другому массиву символов как это. Необходимо будет использовать strcpy () или некоторый цикл для присвоения каждого элемента массива.