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