为什么char数组需要strcpy而char star不需要 - 使用C语言中的结构

时间:2012-07-16 16:09:57

标签: c arrays struct strcpy

我对此代码存在误解 -

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 个答案:

答案 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,这就是编译器不允许的原因。