2

尝试在以下结构中初始化名称时,我收到错误消息“错误:从类型'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 
;}
4

6 回答 6

4

由于您只是尝试初始化结构,因此您可能会逃脱:

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

C 区分初始化和赋值(即使它们使用相同的运算符)。不能分配数组,(memcpy或必须使用类似的代替)但是数据可以以初始值设定项指定的特定值存在。

于 2012-06-06T05:05:43.057 回答
2

改用这个:

strcpy(b.name,"Michael");
于 2012-06-06T04:36:05.183 回答
2

数组不是C 中的指针。您需要strcpy将字符串复制到另一个位置。

于 2012-06-06T04:45:40.187 回答
1

让我们看看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”相同

于 2012-06-06T05:34:34.047 回答
0

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

  • name应更改为 aconst char*并指向文字(此处,const char*不得修改字符串文字),或
  • 来自文字的内容strcpy()-ied name(但您需要小心确保name始终足够大以容纳文本并终止 ASCII NUL/0 字符),或
  • name更改为 achar*并分配给strdup()文字的堆分配副本(这确保您可以在name之后进行修改,并且由控制的内存name将足够大以存储文字的副​​本,但是free(name)当您完成时需要用它)。
于 2012-06-06T05:16:52.553 回答
0

如果你这样做char name[10],你正在静态分配其基地址可以由name变量访问的内存。您不能将地址指针更改为静态分配的数组。即您不能向name变量添加不同的地址。

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

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

于 2012-06-06T04:43:07.037 回答