C语言中为何无法直接给typedef结构体的字符数组赋值?
为什么不能直接用
=给结构体中的字符数组成员赋值? 核心原因:数组名是常量指针
在C语言中,数组名本质是一个指向数组首元素的常量指针——它的值(即数组首元素的内存地址)是固定的,无法被修改。当你写people[0].name = "Brian"时,你试图把字符串字面量"Brian"的地址赋值给name这个常量指针,这违反了C语言的规则,编译器自然会报错。
字符串字面量的本质
"Brian"这类字符串字面量,在程序运行时会被存储在内存的只读区域,它本身是一个指向该区域起始地址的指针。如果你试图用=把它的地址赋值给数组名,相当于要改变数组在内存中的位置,这是不允许的——数组一旦被声明,它的内存位置就固定了。
正确的做法:使用strcpy函数
strcpy函数的作用是将字符串字面量中的每个字符逐个复制到目标数组的内存空间中,而不是修改数组的地址。它会从源字符串的首字符开始,依次复制到目标数组的对应位置,直到遇到结束符\0为止。
修正后的代码如下:
#include <stdio.h> #include <stdbool.h> #include <string.h> typedef struct { char name[100]; char number[100]; } person; int main(void) { person people[2]; strcpy(people[0].name, "Brian"); strcpy(people[0].number, "+1-617-495-1000"); strcpy(people[1].name, "David"); strcpy(people[1].number, "+1-949-468-2750"); }
例外:结构体初始化时可以直接赋值
如果是在声明结构体变量的同时初始化,你可以直接用=给字符数组成员赋值,比如:
person people[2] = { {"Brian", "+1-617-495-1000"}, {"David", "+1-949-468-2750"} };
这是因为初始化操作是在编译阶段完成的,编译器会直接把字符串数据填充到数组的内存空间里,和运行时的赋值操作逻辑不同。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

