2013-04-12 57 views
0

我有以下代码,其中每当我尝试释放我的malloc'ed内存时,我有时会出现段错误。这个错误只发生在释放与我的一些结构成员相关的内存时(仅在昵称和更高版本上),这意味着我从来没有得到free(player->name)的分段错误,但大约有一半时间我从另外两个释放中获得了分段错误仪器仪表是一个空,它没有任何效果)malloc'd指针偶尔出现的段错误

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); 
} 

解决这个任何帮助,将不胜感激。

+0

最有可能你会掉一些数组的边界,写了一些地址,并获得当你释放了错误。你应该尝试调试,甚至可以更方便地运行'valgrind'来查看哪里出了问题和在哪里。 – Shahbaz

回答

2

你(main-)问题是在这一行:

Player one=malloc(sizeof(Player)); 

球员被定义为一个指向player_t结构,所以你没有预留足够的内存,以保持整个结构。第一个指针(name)就足够了,这就是为什么在访问nickname时看到崩溃的原因。

尝试:

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

好的赶上! (+1) – nneonneo

+0

非常感谢,解决了它。 – Thongurf

+1

这就是为什么很多人不喜欢隐藏在typedef中的指针类型,并使用成语'toto * x = malloc(sizeof * x)'来分配空间。 –

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

如果nicknamename长?

+0

感谢您的注意,修复它:) – Thongurf