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";仅此而已?

4

4 回答 4

3

考虑一下这里的类型。该数组包含字符串的内容,而char*指向数据。因此数组需要strcpy和朋友。

此外,如果您char*在堆或堆栈上分配内存,然后想为其分配一些内容,您还必须使用strcpy,因为仅仅分配会创建一个悬空指针(即内存泄漏)。

于 2012-07-16T16:13:08.050 回答
0

因为数组的位置是固定的,而指针(它本身就是一个位置)的值不是。您可以将新值分配给指针,但不能分配给数组。

在引擎盖下,它们都是一样的。C 中的数组名称是一个指针,但从语义的角度来看,您不能重新分配数组,但可以重新指向指针。

于 2012-07-16T16:13:13.480 回答
0

当你写

a.name = "eaaa" ;

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

如果你有数组,你已经有一个分配的内存区域(不能分配给另一个内存位置!),你只能用数据填充它(在这种情况下字节代表你的字符串)。

于 2012-07-16T16:17:07.177 回答
0

这是我对可能是什么原因的理解。

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

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

于 2017-10-15T10:37:19.997 回答