我对以下内容感到有些惊讶.
例1:
char s[100] = "abcd"; // declare and initialize - WORKS
例2:
char s[100]; // declare s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
我想知道为什么第二种方法不起作用.它应该是自然的(它适用于其他数据类型)?有人能解释一下这背后的逻辑吗?
初始化数组时,C允许您使用值填充它.所以
char s[100] = "abcd";
基本上是一样的
int s[3] = { 1, 2, 3 };
但它不允许你进行赋值,因为它s
是一个数组而不是一个自由指针.的含义
s = "abcd"
是分配的指针值abcd
到s
,但你不能改变s
,因为再没有什么将指向数组.
如果s
是char*
- 一个可以指向任何东西的指针,这可以而且确实有效.
如果要复制字符串简单使用strcpy
.
C中没有"字符串"这样的东西.字符串是char的数组,char
按惯例终止.由于无法在C中分配数组,因此也无法分配字符串.文字"你好"是语法糖\0
正确的方法是:
char s[100]; strncpy(s, "hello", 100);
或者更好的是:
#define STRMAX 100 char s[STRMAX]; size_t len; len = strncpy(s, "hello", STRMAX);
初始化和赋值是两个不同的操作,碰巧在这里使用相同的运算符("=").