您不能使用运算符分配数组内容=
。首先,数组对象不能成为赋值运算符的目标(在线 C 标准,草案 n1256,第 6.5.16.1 节,第 1 段)。 strings[0]
是一个类型的数组对象char [6]
,所以它不能出现在=
操作符的 LHS 上。
其次,当一个数组表达式不是运算符sizeof
或地址运算符的操作数,&
也不是用于初始化另一个数组内容的字符串字面量时,表达式的类型将隐式转换(“衰减”) “T 的 N 元素数组”到“指向 T 的指针”,表达式的值是数组中第一个元素的地址(第 6.3.2.1 节,第 3 段)。
字符串文字“test”是char
(const char
在 C++ 中)的 5 元素数组,具有静态范围(意味着它的内存在程序启动时分配并保持到程序退出)。但是,当它出现在表达式中时
strings[0] = "test";
它的类型从“char 的 5 元素数组”转换为“char 指针”,它的值是第一个元素的地址,所以你最终要做的是尝试将指针值分配给数组对象,即不是兼容的类型;糟糕的juju,无论如何都无法分配数组对象。
如果要将一个数组的内容复制到另一个数组,则需要单独分配每个数组元素,例如
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()
vs.存在一场快乐的战争;strncpy()
我的立场是使用适合特定情况的任何一种。如果您知道缓冲区足够大,可以处理最大可能的输入,请使用strcpy()
. 如果没有,请使用strncpy()
,但请注意,您可能必须手动添加 0 终止符。