C内存管理初学者问题
发布时间:2020-12-16 10:45:04 所属栏目:百科 来源:网络整理
导读:好的,我有一块 code: typedef struct faux_crit{ char dna[DNALEN+1]; //#define'd to 16 int x,y; int age; int p; int dir;} crit;crit *makeguy(int x,int y){ crit *guy; guy = (crit *) malloc(sizeof(crit)); strcpy(guy-dna,makedna()); guy-x = x;
好的,我有一块
code:
typedef struct faux_crit { char dna[DNALEN+1]; //#define'd to 16 int x,y; int age; int p; int dir; } crit; crit *makeguy(int x,int y) { crit *guy; guy = (crit *) malloc(sizeof(crit)); strcpy(guy->dna,makedna()); guy->x = x; guy->y = y; guy->age = guy->p = guy->dir = 0; return guy; } char *makedna() { char *dna; int i; dna = (char *) malloc(sizeof(char) * DNALEN+1); for(i = 0; i < DNALEN; i++) dna[i] = randchar(); return dna; } int main() { int i; crit *newguy; srand((unsigned) time(0)); newguy = makeguy(0,0); /*[..] just printing things here */ free(newguy); return 0; } 我只想知道管理内存有什么问题,因为valgrind会报告内存错误.我认为它是makedna中的dna var,但我什么时候应该释放它?离开功能后我无法访问它,我需要将其返回,所以在此之前我无法释放它. 编辑:好的,谢谢大家. 解决方法
最简单的解决方法是更改??makeguy(),如下所示:
char* dna = makedna(); strcpy(guy->dna,dna); free(dna); 但这不是一个好的解决方案,因为您在一个位置分配内存并在其他位置释放它.最好在同一个地方做malloc和free.所以我建议将makedna()更改为: void* makedna(char* dna,int dna_len) { int i; for(i = 0; i < dna_len; i++) dna[i] = randchar(); } 你可以像这样调用makedna(): char* dna = (char*)malloc(DNALEN+1); makedna(dna,DNALEN); dna[DNALEN] = 0; strcpy(guy->dna,dna); free(dna); 现在makedna()只做预期的事情:做一个dna序列.内存管理应由呼叫者处理.此外,如果在不同的呼叫站点需要,该解决方案提供了使用静态字符串阵列的灵活性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |