为什么一个字符数组需要STRCPY和炭星不 - 使用C中的结构(Why does a char ar

2019-09-19 14:06发布

我有一个关于这个代码的一个误区 -

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"; 就这样?

Answer 1:

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

此外,如果你对所分配的内存char*在堆上或栈,然后要分配一些内容到,你也可以选择使用strcpy ,因为一个单纯的分配将创建一个悬摆指针(即内存泄漏)。



Answer 2:

因为阵列的位置是固定的,而一个指针(它是本身的位置)的值不是。 您可以指定新值的指针,而不是一个数组。

引擎盖下,他们都是同样的事情; C中的数组名是一个指针,而是从一个语义点不能重新分配一个数组,但可以重新指向的指针。



Answer 3:

当你写

a.name = "eaaa" ;

编译器将分配内存为NULL结尾的字符串eaaa\0 ,并且因为该指令的,它将使指针name点到该位置(例如, name变量将包含存储器单元的地址,其中所述串的第一字节所在)。

如果你有数组,那么你已经有了分配的内存区域(不能被分配到另一个存储位置!),你只能用数据填充(以表示你的字符串这种情况下字节)。



Answer 4:

这是我讲什么可能是这样做的原因的认识。

我认为这是有关语言的工作方式。 C(和也C ++)产生一个非托管代码 - 这意味着它们不需要的环境(如JVM)上运行的管理存储器,线程等,所以,代码产生于由所述OS直接运行的可执行。 出于这个原因,可执行包括信息,例如,多少空间,要为每种类型的(不确定的动态类型虽然)包括阵列进行分配。 (这也是为什么C ++引入了头文件,因为这是要知道编译过程中的对象的大小的唯一途径)

所以,当编译器看到的字符数组,它计算在编译阶段了多少空间需要,并把这些信息到可执行文件。 运行程序时,流量可以计算出多少空间是必要的,分配多少的内存。 如果更改此多次,比方说在C函数,每个任务将使得前一个(或多个)无效。 因此,国际海事组织,这就是为什么编译器不允许。



文章来源: Why does a char array need strcpy and char star doesn't - using structs in C