在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