将string分配给字符数组

我有点惊讶以下。

例1:

char s[100] = "abcd"; // declare and initialize - WORKS 

例2:

 char s[100]; // declare s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error) 

我想知道为什么第二种方法不起作用。 它应该(它适用于其他数据types)似乎是自然的? 有人能解释我背后的逻辑吗?

当初始化一个数组时,C允许你用值填充它。 所以

 char s[100] = "abcd"; 

基本上是一样的

 int s[3] = { 1, 2, 3 }; 

但它不允许你做assignmend,因为s是一个数组而不是一个空闲的指针。 的意思

 s = "abcd" 

是将“abcd”的指针值赋给“s”,但是不能改变s,因为没有任何东西会指向数组。
如果s是一个char*它可以并且确实可以工作 – 一个可以指向任何东西的指针。

如果你想复制string简单的使用strcpy

C中没有“string”这样的string。string是char的数组,按照惯例以NULL结尾。 既然你不能在C中分配数组,你也不能分配string。 字母“hello”是const char x[] = {'h','e','l','l','o','\0'};语法糖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); 

初始化和赋值是在这里使用相同的运算符(“=”)的两个不同的运算。

 1 char s[100]; 2 s = "hello"; 

在你提供的例子中,s实际上是在第1行而不是在第2行初始化的。尽pipe在这一点上你没有明确地给它赋值,但是编译器却这么做了。 在第二行,你正在执行一个赋值操作,并且你不能把一个字符数组分配给另一个字符数组。 你将不得不使用strcpy()或某种循环来分配数组的每个元素。

扩展Sparr的答案

初始化和赋值是在这里使用相同的运算符(“=”)的两个不同的运算。

像这样想:

想象一下,有2个函数,称为InitializeObjectAssignObject 。 当编译器看到thing = value ,它会查看上下文,如果您正在创build新thing ,则调用一个InitializeObject 。 如果你不是,它调用AssignObject

通常这很好,因为InitializeObjectAssignObject行为通常是一样的。 除了处理char数组(和其他一些边缘情况),在这种情况下,它们的行为是不同的。 为什么这样做? 那么这是一个涉及堆栈和堆等等的整个其他职位。

PS:另外,以这种方式思考它也可以帮助你理解拷贝构造函数和其他类似的东西,如果你冒险进入C ++

请注意,你仍然可以这样做:

 s[0] = 'h'; s[1] = 'e'; s[2] = 'l'; s[3] = 'l'; s[4] = 'o'; s[5] = '\0'; 

你可以使用这个:

 yylval.sval=strdup("VHDL + Volcal trance..."); 

yylval是char *。 从事这项工作。

我会用什么

 char *s = "abcd";