我对此代码有误解-
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";
仅此而已?
考虑一下这里的类型。该数组包含字符串的内容,而char*
仅指向数据。因此数组需要strcpy
和朋友。
此外,如果您char*
在堆或堆栈上分配内存,然后想为其分配一些内容,您还必须使用strcpy
,因为仅仅分配会创建一个悬空指针(即内存泄漏)。
因为数组的位置是固定的,而指针(它本身就是一个位置)的值不是。您可以将新值分配给指针,但不能分配给数组。
在引擎盖下,它们都是一样的。C 中的数组名称是一个指针,但从语义的角度来看,您不能重新分配数组,但可以重新指向指针。
当你写
a.name = "eaaa" ;
编译器将为 NULL 终止的字符串分配内存,eaaa\0
并且由于该指令,它将使指针name
指向该位置(例如,该name
变量将包含该字符串的第一个字节所在的内存位置的地址)。
如果你有数组,你已经有一个分配的内存区域(不能分配给另一个内存位置!),你只能用数据填充它(在这种情况下字节代表你的字符串)。
这是我对可能是什么原因的理解。
我认为这与语言的工作方式有关。C(以及 C++)生成非托管代码 - 这意味着它们不需要运行环境(如 JVM)来管理内存、线程等。因此,代码被生成为由操作系统直接运行的可执行文件. 出于这个原因,可执行文件包括信息,例如,为包括数组在内的每种类型(虽然不确定动态类型)分配多少空间。(这也是 C++ 引入头文件的原因,因为这是在编译期间了解对象大小的唯一方法)
因此,当编译器看到一个字符数组时,它会计算在编译阶段需要多少空间并将该信息放入可执行文件中。运行程序时,流程可以计算出需要多少空间并分配多少内存。如果您多次更改它,假设在 C 函数中,每个赋值都会使前一个(s)无效。所以,IMO,这就是编译器不允许这样做的原因。