【问题标题】:Segmentation Fault in strcpy()strcpy() 中的分段错误
【发布时间】:2012-04-25 23:28:28
【问题描述】:

我有这样的基本结构

typedef struct struck {
    char* id;
    char* mat;
    int value;
    char* place;
} *Truck;

像这样的函数会创建该结构的新“实例”:

Truck CTruck(char* id, char* mat, int value, char* place) {
    Truck nT = (Truck) malloc(sizeof (Truck));
    nT->value = value;
    strcpy(nT->id, id);
    strcpy(nT->mat, mat);
    strcpy(nT->place, place);
    return nT;
}

我在第一个 strcpy 中遇到错误。它编译没有问题。

【问题讨论】:

    标签: c segmentation-fault strcpy


    【解决方案1】:

    您对sizeof 的用法不正确。通常,malloc() 的参数需要是“返回的指针指向的大小”。换句话说,你需要sizeof *nT。看看这如何消除重复类型名称 (Truck)?

    另外,在 C 中你 don't need to cast the return value of malloc();它没有任何用处,可以隐藏实际错误,并使代码更难阅读。

    正如其他人所指出的,您也没有为任何字符串数据分配空间,您所拥有的只是结构中的指针。

    【讨论】:

      【解决方案2】:

      您的 typedef 将 Truck 定义为 struct struck *,即指针。所以它的大小将是 48 取决于架构而不是结构的大小

      使用sizeof(*Truck) 获取结构体的实际大小。

      您还需要为字符分配内存。最简单的方法是使用strdup()

      Truck CTruck(const char* id, const char* mat, int value, const char* place) {
          Truck nT = malloc(sizeof (*Truck));
          nT->value = value;
          nT->id = strdup(id);
          nT->mat = strdup(mat);
          nT->place = strdup(place);
          return nT;
      }
      

      但是,我建议更改您的 typedef,使其成为结构的别名,而不是指向它的指针:

      typedef struct {
          char* id;
          char* mat;
          int value;
          char* place;
      } Truck;
      

      然后在你的函数中使用这个:

      Truck *nT = malloc(sizeof(Truck));
      

      【讨论】:

      • +1 并且还为 id、mat 和 place 分配了一些空间,这样 strcpy 就不会消除随机内存。
      • strdupftw;无需使用 malloc 和讨厌的 strcpy
      • 我有更多在 typedef 末尾使用 *Stuff 的结构,如果我将其更改为 }Truck,它会给每个结构带来错误,如果我使用 *Truck,malloc(sizeof(Truck)) 将不起作用
      • 好吧,我想问题也出在使用 strcpy 上,我不知道 strdup,谢谢大家
      • +1 告诉该人使用typedef 作为struct 的别名
      【解决方案3】:

      nT->id 只是一个指针。需要将字符串复制到malloc内存中。其他人也一样。

      【讨论】:

        猜你喜欢
        • 2014-06-15
        • 1970-01-01
        • 2016-02-24
        • 1970-01-01
        • 2020-10-05
        • 2014-10-21
        • 2013-02-23
        • 2017-09-17
        • 2018-12-26
        相关资源
        最近更新 更多