尝试在以下结构中初始化名称时,我收到错误消息“错误:从类型'char *'分配给类型'char [10]'时不兼容的类型” :
#include <stdio.h>
struct info
{
char name[10];
int years;
};
int main(void){
struct info b;
b.name = "Michael";
b.years = 19;
return 0
;}
尝试在以下结构中初始化名称时,我收到错误消息“错误:从类型'char *'分配给类型'char [10]'时不兼容的类型” :
#include <stdio.h>
struct info
{
char name[10];
int years;
};
int main(void){
struct info b;
b.name = "Michael";
b.years = 19;
return 0
;}
由于您只是尝试初始化结构,因此您可能会逃脱:
struct info b = {"Michael", 19};
C 区分初始化和赋值(即使它们使用相同的运算符)。不能分配数组,(memcpy
或必须使用类似的代替)但是数据可以以初始值设定项指定的特定值存在。
改用这个:
strcpy(b.name,"Michael");
让我们看看main()
运行时会发生什么。
struct info b;
通过这个你初始化struct
,包括其中的name
。
name
是一个 char 数组(正如 Jay 指出的,它与指针不同),现在它被分配了一块内存,里面有一些随机的东西。
下一个
b.name = "Michael";
通过这种方式,您尝试将字符串文字分配给您的 char 数组。
通常,您在声明中将字符串文字分配给 char 数组,如下所示char a[] = "hello";
它会将字符串文字复制到一块内存中,然后a
“将内存放在一边”。但是,在您的情况下,b.name
已经坐在另一块内存旁边,并且您不能仅通过分配来更改坐姿,因为数组不是指针。
所以,如果你想修改b.name
,你要么strcpy
像 Vaughn Cato 说的那样使用,要么按字符来做那个字符,比如
b.name[0] = 'M';
b.name[1] = 'i';
...
这本质上与“strcpy”相同
问题是名称的地址必须在包含它的信息对象的内存中,而字符串字面量在内存的某个不同区域中。编译器确保它们的位置是合理的,因为它们在您的程序中被提及,并且它们不能被任意移动或合并。任何一个:
name
应更改为 aconst char*
并指向文字(此处,const char*
不得修改字符串文字),或strcpy()
-ied name
(但您需要小心确保name
始终足够大以容纳文本并终止 ASCII NUL/0 字符),或name
更改为 achar*
并分配给strdup()
文字的堆分配副本(这确保您可以在name
之后进行修改,并且由控制的内存name
将足够大以存储文字的副本,但是free(name)
当您完成时需要用它)。如果你这样做char name[10]
,你正在静态分配其基地址可以由name
变量访问的内存。您不能将地址指针更改为静态分配的数组。即您不能向name
变量添加不同的地址。
在你做 b.name = "Micheal" 时,你就是这样做的。您正在尝试将“Micheal”字符串的基地址添加到name
变量中。
因此,正如@Vaughn 所说,将“Micheal”复制到 b.name 指向的内存中。或在结构中,更改char name[10]
为char *name