加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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序列.内存管理应由呼叫者处理.此外,如果在不同的呼叫站点需要,该解决方案提供了使用静态字符串阵列的灵活性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读