2012-07-16 25 views
2

使用结构我有一个关于这个代码的一个误区 -为什么一个字符数组需要STRCPY和炭星不 - 用C

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

因为数组不可分配。因此,您必须将其应该保存的值复制到它中。 – 2012-07-16 16:11:19

+0

Array!=指针,虽然有很多情况下数组衰减到指针,这是混淆的根源。 – nhahtdh 2012-07-16 16:11:57

+0

ohh我该如何接受答案? – user1386966 2012-07-16 16:27:20

回答

3

那么考虑这里的类型。该数组有内容的字符串,而char*只是指向的数据。因此阵列需要strcpy和朋友。

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

0

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

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

0

当你写

a.name = "eaaa" ; 

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

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

0

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

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

因此,当编译器看到一个字符数组时,它会计算需要多少空间编译阶段并将该信息放入可执行文件中。运行程序时,流程可以计算出需要多少空间并分配大量内存。如果多次改变这个,我们假设在C函数中,每个赋值都会使前一个无效。所以,国际海事组织,这就是为什么编译器不允许。

相关问题