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