有人可以解释一下这段涉及 free() 的代码实际上做了什么吗

标签 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是否指向整个数组a[]?例如,a[0] 和 a[1]... 将是 char 指针。 a 指向整个 malloc'd char* block 还是只是 a[0]?谢谢!我真的很感谢您的帮助!!

最佳答案

resize 函数基本上会调整给定内存块的大小,使其大小变为原来的两倍 (size2 = *size * 2)

发生以下情况:

  • 为调整大小的 block 分配新内存
  • 指向科目、类(class)和“CRN”的指针将复制到新内存
  • 旧的内存块被释放。这 free() 旧内存块指向的 block !因此新列表仍然指向有效(未删除)的 block 。
  • 新 block 的附加部分被初始化(通过用新分配的科目和类(class)数据内存填充它们的指针)

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

关于你的第二个问题

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

a 是一个长度为 100 的 char* 指针列表。分配该列表,列表中的项目是未定义指针。要初始化这些项目,您可以使用:

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

现在所有项目都指向大小为 SIZE_OF_CHARchar*

关于有人可以解释一下这段涉及 free() 的代码实际上做了什么吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26034576/

相关文章:

在c中的特定内存位置创建数据结构

java - 是否可以更改数组中的变量值

c - 在指针上调试 C 程序时出错

c++ - 是否可以从指针的多态容器返回 'accurate' 对象?

c - 在 C 中连接字符串指针时如何避免内存泄漏

c - 我正在尝试打印 txt 文件,但它在 C 作业中不起作用

c - 如何找到文件中值的最小值/最大值

c - 为什么数组指针的地址与该指针中存储的数据相同?

java - 返回该对象之前增加对象中的静态变量

c++ - 访问冲突 C++