【问题标题】:Occasional segmentation fault on malloc'd pointersmalloc 指针上的偶尔分段错误
【发布时间】:2013-04-12 14:53:34
【问题描述】:

我有以下代码,其中每当我尝试释放我的 malloc'ed 内存时,我有时会遇到分段错误。此错误仅在释放与我的某些结构成员关联的内存时发生(仅在昵称及以上),这意味着我从未遇到过 free(player->name) 的分段错误,但大约有一半的时间我从其他两个 free 中获得分段错误(看看instruments怎么是null,没有效果)

typedef struct player_t {
    char * name;
    char * nickname;
    Instrument * instruments;
    int instrumentAmount;
} * Player;

Player playerCreate(const char* name, const char* nickname,
int maxInstruments) {
    Player one=malloc(sizeof(Player));
    if(one==NULL || !checkLegalName(name)|| !checkLegalName(nickname) ||   maxInstruments<=0) {
        return NULL;
    }

    one->name=malloc(strlen(name)+1);
    one->nickname=malloc(strlen(name)+1);

    if(!one->name || !one->nickname) {
        playerDestroy(one);
        return NULL;
    }

    strcpy(one->name,name);
    strcpy(one->nickname,nickname);
    one->instrumentAmount=maxInstruments;
    one->instruments=NULL;
    return one;
}

接下来是:

void playerDestroy(Player player) {
    if( !player) {
        return;
    }

    free(player->name);
    free(player->nickname); // this is where it happens.
    free(player->instruments);
    free(player);
}

任何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 很可能你正在超出某个数组的边界,写入某个地址并在释放时得到错误。您应该尝试调试,并且可能更方便地运行 valgrind 以查看发生了什么问题以及在哪里。

标签: c pointers struct malloc fault


【解决方案1】:

您的(主要)问题在这一行:

Player one=malloc(sizeof(Player));

Player 被定义为指向 player_t 结构的指针,因此您没有保留足够的内存来保留整个结构。第一个指针 (name) 就足够了,这就是您在访问 nickname 时看到崩溃的原因。

试试:

Player one=malloc(sizeof(struct player_t));

【讨论】:

  • 这就是为什么很多人不喜欢隐藏在 typedef 中的指针类型而使用成语toto *x = malloc(sizeof *x) 来分配空间的原因。
【解决方案2】:
one->nickname=malloc(strlen(name)+1);
...
strcpy(one->nickname,nickname);

如果nicknamename 长怎么办?

【讨论】:

  • 感谢您的关注,已修复:)
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多