char label[10] = "Me"
有效,并且要更改 的值label
,我必须执行以下操作:
char * temp = "Not Me";
strcpy(label,temp);
我的问题是为什么这是无效的?
char label[] = "Me";
label = "Not me";
char label[10] = "Me"
有效,并且要更改 的值label
,我必须执行以下操作:
char * temp = "Not Me";
strcpy(label,temp);
我的问题是为什么这是无效的?
char label[] = "Me";
label = "Not me";
因为数组是不可分配的。你可以创建它们,你可以改变它们的内容,但是数组本身不能被修改来引用一个新的内存块。
原因label="Not Me"
不起作用,是因为标签的类型是 a char *
。你把它定义为一个数组,数组和指针在语义上是等价的。指针是一个地址,基本上是一个地址,因此将类似的东西分配给具有指针类型的东西是int
没有意义的。"Not Me"
您需要做的是取消引用指针并将值分配给指向的位置。由于类型是char *
,您需要取消引用每个位置并为每个位置分配一个字符。
例如
label[0] = 'N';
label[1] = 'o';
...
或者使用一些等效的 for 循环。
在 C 中,数组标签本质上与指针标签相同,只是数组在定义时会自动获得一些分配在其后面的内存。
否则,数组标签和指针标签被视为同一事物。因此,即使您声明label
为数组,如果您直接操作label
(后面没有大括号),您也将其视为指针(恰好指向第一个数组元素)。同样,如果您声明label
为指针,但对 进行操作label[x]
,则您正在对位置指向 (aka: )之后的x
第一个数据项进行操作。label
*(label + x)
你的第一直觉可能是看起来很不安全。你是对的。该语言是在 60 年代末和 70 年代初设计的,当时使编译器易于在当时的微型机器上实现比该语言的易错性重要得多。