有人可以解释这个涉及free()的代码实际上是什么

时间:2014-09-25 09:06:45

标签: c arrays pointers malloc free

我想过,一旦你在内存位置上使用了free(),那个内存就会被返回到内存中,如果你在释放后写入该位置,那么它将是未定义的行为吗?这是我老师的代码。有人可以解释他在做什么吗?我不明白为什么他写的是刚刚被释放的记忆。谢谢!

void initialize(char ***subjects, char***courses, int **CRNs, int *size)
{ 
  int i;

  *subjects = (char**) malloc (INITIAL_COURSE_SIZE * sizeof(char*));
  *courses = (char**) malloc(INITIAL_COURSE_SIZE * sizeof(char*));
  *CRNs = (int*) malloc(INITIAL_COURSE_SIZE * sizeof(int));

      for(i = 0; i < INITIAL_COURSE_SIZE; i++)
      { 
        (*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char));
        (*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char));
      } // for i

  *size = INITIAL_COURSE_SIZE;
}  // initalize()


void resize(char ***subjects, char***courses, int **CRNs, int *size)
{ 
  int i, *CRNs2, size2 = *size * 2;
  char **subjects2, **courses2;


  subjects2 = (char**) malloc (size2 * sizeof(char*));
  courses2 = (char**) malloc(size2 * sizeof(char*));
  CRNs2 = (int*) malloc(size2 * sizeof(int));

  for(i = 0; i < *size; i++)
  { 
    subjects2[i] = (*subjects)[i];
    courses2[i] = (*courses)[i];
    CRNs2[i] = (*CRNs)[i];
  } // for i

  free(*subjects); //WHY DOES HE FREE THIS??????
  free(*courses);
  free(*CRNs);
  *subjects = subjects2;
  *courses = courses2;
  *CRNs = CRNs2;

  for(; i < size2; i++)
  { 
    (*subjects)[i] = (char*) malloc(SUBJECT_SIZE * sizeof(char));
    (*courses)[i] = (char*) malloc(COURSE_SIZE * sizeof(char));
  } // for i

  *size = size2;
} // resize()

另外,如果我这样做:

char **a;
a = (char*)malloc(sizeof(char*) * 100);

是否指向整个数组a []?例如,[0]和[1] ......将是char指针。是指向malloc的char *的整个块还是仅仅[0]?谢谢!我真的很感激帮助!!

1 个答案:

答案 0 :(得分:1)

resize函数基本上调整了给定内存块的大小,使它们的大小增加了两倍(size2 = *size * 2

发生以下情况:

  • 为调整大小的块分配新内存
  • 指向主题,课程和CRN的指针被复制到新内存
  • 释放旧的内存块。这样做 free()旧内存块所指向的块!因此新列表仍指向有效(未删除)块。
  • 初始化新块的附加部分(通过填写指针,为主题和课程数据重新分配内存)

请注意,所有函数参数都包含一个额外的*,因此新的内存块和大小被“返回”(并且可以在应用程序的其余部分中使用)。

关于你的第二个问题

char **a;
a = (char*)malloc(sizeof(char*) * 100);

achar*的列表 - 长度为100的指针。列表已分配,列表中的项目未定义指针。要初始化这些项目,您可以使用:

for(int i = 0; i < 100; i++) {
    a[i] = malloc(SIZE_OF_CHAR);
}

现在所有项目都指向char*,其大小为SIZE_OF_CHAR