2012-06-06 23 views
2

当试图初始化以下结构中的名称时,出现错误消息“错误:从类型'char *'”分配类型'char [10]'时的不兼容类型:C编程中的结构(初始化语句)

#include <stdio.h> 

struct info 
{ 
    char name[10]; 
    int years; 
}; 

int main(void){ 
    struct info b; 

    b.name = "Michael"; 
    b.years = 19; 
    return 0 
;} 
+3

这不是简单的c –

+0

数组与指针不同,请查看Jay的回答中的链接 – xvatar

回答

2

使用这个代替:

strcpy(b.name,"Michael"); 
+0

有没有办法在不使用字符串库的情况下做到这一点?我不明白为什么这不起作用。 –

+0

@ Michael_19:你称之为“字符串库”,实际上是C标准库的一部分。你应该可以使用它,除非你有充分的理由不将你的程序与C标准库链接。 – jweyrich

+1

@ Michael_19:如果你愿意,你可以使用循环代替:'struct info in; \t char name [] =“Michael”; \t int i = 0; \t while(i <9) \t { \t \t in.name [i] = name [i]; \t \t i ++; \t} \t in.name [i] ='\ 0';' – Jack

0

如果你做char name[10]你staticaly分配,其基址可以通过name变量来访问内存。您不能将地址指针变为静态分配的数组。即不能为name变量添加不同的地址。

在你做b.name =“Micheal”,你就是这么做的。您正试图将“Micheal”字符串的基址添加到name变量中。

因此,要像@Vaughn所说的那样,将“Micheal”复制到b.name指向的内存中。或在结构中将char name[10]更改为char *name

4

既然你只是想初始化结构,你很可能逃脱:

struct info b = {"Michael", 19}; 

Ç使得初始化和赋值(即使它们使用相同的运营商)之间的区别。数组不能分配,(必须使用memcpy或类似的方法),但是数据可以由初始化程序指定的某个值生成。

0

问题是,名称的地址必须位于包含它的信息对象的内存中,而字符串文字位于内存的某个不同区域。编译器确保它们的位置在您的程序中提及的位置是合理的,并且它们不能被任意移动或合并。或者:

  • name应改为const char*,并在文字(在这里,作为const char*字符串文字不得修改),或
  • 从字面strcpy() -ied到name内容指出(但你需要注意确保name总是足够大的文本和终止ASCII NUL/0字符),或
  • name更改为char*并分配给strdup()文字的堆分配副本(它确保你可以修改name船尾而且由name控制的内存将足够大以存储文字的副​​本,但在完成时需要free(name))。
1

让我们来看看main()运行时会发生什么。

struct info b; 

通过这个,你初始化struct,包括它的name

name是一个字符数组(正如Jay指出的,它不同于指针),现在它被分配了一块内存和一些随机的东西在里面。

下一页

b.name = "Michael"; 

通过这个尝试将字符串字面量分配给您的字符数组。

通常情况下,你在声明中指定字符串文本字符数组这样char a[] = "hello";

将字符串文字复制到一块内存,让a“坐在一旁的记忆”。然而,在你的情况下,b.name已经坐在另一块内存上,你不能通过只做一个任务来改变坐姿,因为数组不是指针

所以,如果你想修改b.name,你要么使用strcpy作为沃恩卡托说,要不你通过系统字符做到这一点的性格,像

b.name[0] = 'M'; 
b.name[1] = 'i'; 
... 

基本上是同样的事情“的strcpy”