【问题标题】:Why does a char array need strcpy and char star doesn't - using structs in C为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构
【发布时间】:2012-07-15 12:46:36
【问题描述】:

我对这段代码有误解 -

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"; 仅此而已?

【问题讨论】:

  • 因为数组是不可赋值的。因此,您必须将它应该保存的值复制到其中。
  • Array != 指针,虽然在很多情况下数组会衰减为指针,这是混乱的根源。

标签: c arrays struct strcpy


【解决方案1】:

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

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

因此,当编译器看到一个字符数组时,它会计算在编译阶段需要多少空间并将该信息放入可执行文件中。运行程序时,流程可以计算出需要多少空间并分配多少内存。如果您多次更改它,假设在 C 函数中,每个赋值都会使前一个(s)无效。所以,IMO,这就是编译器不允许这样做的原因。

【讨论】:

    【解决方案2】:

    当你写作时

    a.name = "eaaa" ;
    

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

    如果你有数组,你已经有一个分配的内存区域(不能分配给另一个内存位置!),你只能用数据填充它(在这种情况下,字节代表你的字符串)。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        请考虑这里的类型。该数组包含字符串的内容,而char*指向 数据。因此该数组需要strcpy 和朋友。

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

        【讨论】:

          猜你喜欢
          • 2020-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 2013-10-30
          • 2021-07-18
          相关资源
          最近更新 更多