在C中,为什么我不能在声明后将字符串赋值给char数组?

这一直困扰着我。

struct person { char name[15]; int age; }; struct person me; me.name = "nikol"; 

当我编译时,我收到此错误:

错误:从类型’char *’分配类型’char [15]’时出现不兼容的类型

我错过了一些明显的东西吗?

数组是C中的二等公民,他们不支持任务。

 char x[] = "This is initialization, not assignment, thus ok."; 

这不起作用:

 x = "Compilation-error here, tried to assign to an array."; 

使用库函数或手动复制每个元素:

 #include  strcpy(x, "The library-solution to string-assignment."); 

me.name = "nikol"; 是错的 !! 你需要使用strcpy()

当你执行x = "Some String" ,实际上你将静态字符串"Some String"的起始地址放入变量x 。 在您的情况下, name是一个静态数组,您无法更改地址。 您需要的是将字符串复制到已分配的数组name 。 为此,请使用strcpy()

首先,您需要了解以下几点:

  • 在C中,文本字符串只是数组。
  • 在C中,数组变量基本上只是指针。

所以, char mytext[12]; 实际上只是声明一个名为mytext的char指针,它存储数组/字符串的第一个(第零个)元素的地址。

因此,此代码有效:

 #include  int main(int argc, char *argv[]) { const char a[] = "Hello"; const char *b = a; printf("%s\n", b); return 0; } 

这里需要注意的重要一点是,重新分配b不会改变它所指向的内容 – 它会改变它指向的内容。

但是,有些情况下数组和指针的行为不同。 在上面的示例中,无法重新分配。 如果你尝试, 你会收到一个错误 。

回到原来的例子,这个结构:

 struct person{ char name[15]; int age; }; 

…可以被认为是一个19字节的结构*,其中前15个字节被指定用于存储字符串。 name属性存储第一个字节的地址,因此您可以知道这15个字节在内存中的位置 – 您只需要在其中编写有用的内容。

这是sprintf()strcpy()等函数发挥作用的地方 – 它们将数据复制到name 定义的地址中,而不是重新分配name本身。

*假设sizeof(int)为4且结构未填充,当然……

初始化:

 char name[15] 

正在创建一个15字节的char数组。

“nikol”是一个字符串文字,类型为’char *’,即指向字符串的指针。 它们是不兼容的类型。 您需要将字符串复制到数组中,如下所示:

 strcpy(me.name, "nikol") 

使用strcpy()函数( string.h库):)

 main(){ struct person{ char name[15]; int age; }; struct person me; strcpy(me.name,"nikol"); } 

您正在尝试更改数组指针的内存地址(通过提供me.name =“nikol”)这是不可能的。 数组的名称(me.name)是一个固定的指针,不能更改为指向字符串的新位置(“nikol”),因为数组指针的内存地址位于该数组的第一个成员上。 如果要在声明后指定一个字符串(me.name =“nikol”),请使用外部指针* name,因为外部指针浮动在数组外部,因此可以在运行时更改其值。

 struct person { char *name; int age; }; struct person me; me.name = "nikol"; // no error