Массив нельзя присвоить с помощью оператора =
. Прежде всего, объект массива не может быть целью оператора присваивания ( Online C Standard, черновик n1256 , раздел 6.5.16.1, пункт 1). strings[0]
- это объект массива типа char [6]
, поэтому он не может появиться в LHS оператора =
.
Во-вторых, когда выражение массива не является операндом операторов sizeof
или address-of &
и не является строковым литералом, используемым для инициализации содержимого другого массива, тип выражения неявно преобразуется («распадается») из «массива N-элементов из T» в «указатель на T», а значением выражения является адрес первого элемента в массиве (раздел 6.3.2.1, параграф 3).
Строковый литерал «test» представляет собой 5-элементный массив char
(const char
в C ++) со статическим экстентом (это означает, что память для него выделяется при запуске программы и удерживается до выхода из программы). Однако, когда он появляется в выражении
strings[0] = "test";
его тип преобразуется из «5-элементного массива char» в «указатель на char», а его значение является адресом первого элемента, поэтому вы пытаетесь назначить указатель значение для объекта массива, который не является совместимым типом; плохое дзюю, сверх того, что он все равно не может назначить объект массива.
Если вы хотите скопировать содержимое одного массива в другой, вам нужно будет либо назначить каждый элемент массива индивидуально, например,
strings[0][0] = 't';
strings[0][1] = 'e';
strings[0][2] = 's';
strings[0][3] = 't';
strings[0][4] = 0;
или даже
size_t len = strlen("test");
size_t i;
for (i = 0; i < sizeof strings[0] - 1 && i < len; i++)
strings[0][i] = "test"[i]; // yes, you can subscript a string literal
strings[0][i] = 0;
или используйте библиотечную функцию, например memcpy()
, strcpy()
, strncpy()
, strcat()
, sprintf()
и т. Д.:
strcpy(strings[0], "test");
или
strncpy(strings[0], "test", sizeof strings[0] - 1); // -1 to leave room
// for 0 terminator
// if necessary
или
sprintf(strings[0], "%*s", (int) sizeof strings[0] - 1, "test");
Обратите внимание, что вы можете инициализировать содержимое массива при его объявлении, например:
char foo[] = "test"; // foo is implicitly sized to 5 (+1 for 0 terminator)
int bar[] = {1,2,3,4,5}; // again, size is implied from initializer
float f[3] = {1.0, 2.0, 3.0}; // Initializer cannot contain more items than
// array is sized for
Я вижу, что идет веселая война за использование strcpy()
против strncpy()
в комментариях к другому ответу; моя позиция заключается в том, чтобы использовать тот, который соответствует данной ситуации. Если вы знаете, что ваши буферы достаточно велики для обработки максимально возможного ввода, используйте strcpy()
. Если нет, используйте strncpy()
, но имейте в виду, что вам, возможно, придется добавить терминатор 0 вручную.