我有一个关于这个代码的一个误区 -
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";
就这样?
我有一个关于这个代码的一个误区 -
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)上运行的管理存储器,线程等,所以,代码产生于由所述OS直接运行的可执行。 出于这个原因,可执行包括信息,例如,多少空间,要为每种类型的(不确定的动态类型虽然)包括阵列进行分配。 (这也是为什么C ++引入了头文件,因为这是要知道编译过程中的对象的大小的唯一途径)
所以,当编译器看到的字符数组,它计算在编译阶段了多少空间需要,并把这些信息到可执行文件。 运行程序时,流量可以计算出多少空间是必要的,分配多少的内存。 如果更改此多次,比方说在C函数,每个任务将使得前一个(或多个)无效。 因此,国际海事组织,这就是为什么编译器不允许。