c中的字符串文字

时间:2010-08-13 03:52:54

标签: c

为什么以下代码非法?

typedef struct{
   char a[6];
} point;

int main()
{
   point p;
   p.a = "onetwo";
}

它与文字的大小有什么关系吗?或者在声明后将字符串文字分配给char数组是否非法?

6 个答案:

答案 0 :(得分:12)

它与尺寸无关。在创建char数组后,不能将其分配给char数组 - 只能在定义时使用它。

当你这样做时

char a[] = "something";

它创建一个足够大小的数组(包括终止null)并将字符串复制到数组中。使用字符串文字初始化数组时,指定数组大小不是一个好习惯 - 您可能不会考虑空字符。

当你这样做时

char a[10];
a = "something";

您正在尝试分配数组的地址,这是非法的。

编辑:如其他答案中所述,您可以执行strcpy / strncpy,但请确保使用所需的长度初始化数组。

strcpy(p.a, "12345");//give space for the \0

答案 1 :(得分:7)

创建数组后,永远不能分配数组;这同样是非法的:

int foo[4];
int bar[4];
foo = bar;

您需要使用指针,或分配给数组的索引;这是合法的:

p.a[0] = 'o';

如果你想在结构中留下一个数组,你可以使用像strcpy这样的函数:

strncpy(p.a, "onetwo", 6);

(请注意,char数组必须足够大才能容纳nul-terminator,因此您可能希望将其设为char a[7]并将最后一个参数更改为strncpy为7 )

答案 2 :(得分:7)

数组是non modifiable lvalues。所以你不能分配给他们。赋值运算符的左侧必须是modifiable lvalue

但是,您可以在定义数组时对其进行初始化。

例如:

 char a[] = "Hello World" ;// this is legal
 char a[]={'H','e','l','l','o',' ','W','o','r','l','d','\0'};//this is also legal

 //but

 char a[20];
 a = "Hello World" ;// is illegal 

但是,您可以使用strncpy (a, "Hello World",20);

答案 3 :(得分:3)

正如其他答案已经指出的那样,您只能使用字符串文字初始化字符数组,不能将字符串文字分配给字符数组。然而,结构(甚至那些包含字符数组的结构)是另一种鱼。

我不建议在实际程序中执行此操作,但这表明虽然无法分配数组类型,但包含数组类型的结构可以是。

typedef struct
{
    char value[100];
} string;

int main()
{
    string a = {"hello"};
    a = (string){"another string!"}; // overwrite value with a new string
    puts(a.value);

    string b = {"a NEW string"};
    b = a; // override with the value of another "string" struct
    puts(b.value); // prints "another string!" again
}

因此,在您的原始示例中,以下代码应编译良好:

typedef struct{
    char a[6];
} point;

int main()
{
   point p;

   // note that only 5 characters + 1 for '\0' will fit in a char[6] array.
   p = (point){"onetw"};
}

答案 4 :(得分:1)

请注意,为了在数组中存储字符串“onetwo”,它必须长度为[7],而不是在问题中写入。额外的字符用于存储'\ 0'终止符。

答案 5 :(得分:1)

不需要strcpy或C99 compund literal。纯ANSI C中的示例:

typedef struct{
   char a[6];
} point;

int main()
{
   point p;
   *(point*)p.a = *(point*)"onetwo";
   fwrite(p.a,6,1,stdout);fflush(stdout);
   return 0;
}