为什么字符数组需要strcpy而字符指针不需要——在C语言中使用结构体

3
我对这段代码存在误解 -
typedef struct _EXP{
    int x;
    char* name;
    char lastName[40];
 }XMP

...main...
XMP a;
a.name = "eaaa";
a.lastName = strcpy(a.lastName, "bbb");

为什么我不能只使用 a.lastName = "bbbb"; 呢?

7
由于数组不可赋值,因此您必须将应该存储在其中的值复制到它中。 - Daniel Fischer
数组!=指针,虽然有许多情况下数组会衰减成为指针,这就是混淆的源头。 - nhahtdh
4个回答

3
考虑一下这里的类型。数组包含字符串的内容,而“char *”仅指向数据。因此,数组需要使用“strcpy”等函数。
此外,如果您在堆栈上为“char *”分配了内存,然后想要将一些内容赋给它,也必须使用“strcpy”,因为仅仅赋值会创建悬空指针(即内存泄漏)。

0
因为数组的位置是固定的,而指针的值(它本身就是一个位置)不是。你可以给指针赋新值,但不能给数组赋新值。
从底层来看,它们其实是同一种东西;在 C 语言中,数组名是一个指针,但从语义角度来看,你不能重新分配一个数组,但可以重新指向一个指针。

0

当你写代码时

a.name = "eaaa" ;

编译器将为以NULL结尾的字符串eaaa\0分配内存,因为该指令,它将使指针name指向该位置(例如,name变量将包含字符串第一个字节所在的内存地址)。

如果您有数组,则已经分配了一块内存区域(无法分配给另一个内存位置!),并且只能使用数据填充它(在本例中,是表示字符串的字节)。


0

这是我对这个问题可能原因的理解。

我认为这与语言的工作方式有关。C(以及C++)生成的是非托管代码-这意味着它们不需要环境(比如JVM)来管理内存、线程等。因此,代码被生成为一个可执行文件,由操作系统直接运行。因此,可执行文件包含信息,例如为每种类型分配多少空间(尽管对于动态类型不确定)。 (这也是为什么C++引入了头文件,因为这是在编译期间知道对象大小的唯一方式)

所以,当编译器看到一个字符数组时,它会在编译阶段计算需要多少空间,并将该信息放入可执行文件中。在运行程序时,程序可以确定需要多少空间,并分配相应的内存。如果您多次更改此内容,在C函数中进行多次赋值,每个赋值将使之前的赋值无效。因此,在我看来,这就是编译器不允许这样做的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接