c - 如何为指向 int 的指针数组正确释放动态分配的内存

标签 c malloc free

我需要知道在尝试为指向 int 的指针数组释放动态分配的内存时是否正确使用了 free()

我的代码是根据我的一本书中的代码片段修改而来的,并且是请求三个城市的温度读数的程序的开头。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int ctr, num, num2 = 0, ctr2 = 0;
  int* temps[3];
  for(ctr = 0; ctr < 3; ctr++)
  {
     puts("how many readings for the city?");
     scanf(" %d", &num);
     temps[ctr] = (int*)malloc(num * sizeof(int));
     num2 += num;
     while(ctr2 < num2)
     {
         puts(" what is reading? ");
         scanf(" %d", &temps[ctr][ctr2]);
         printf("echo: %d ", temps[ctr][ctr2]);

         ctr2++;
     }
  }

  for(ctr = 0; ctr < 3; ctr++)
  {
      free(temps[ctr]);
  }

  getchar();
  getchar();

  return (0);
}

我知道使用 malloc() 分配内存的指针可能具有通过循环和数组索引的组合分配和访问的值。因此,我使用二维数组的索引从用户输入中分配了值,并且需要知道我是否正确使用了 free 。我知道这是非常草率的编码,我只是想正确理解 free 以防止任何潜在的内存泄漏。

最佳答案

没关系,因为您使用相同的语句分配和释放相同数量的循环:

for(ctr = 0; ctr < 3; ctr++)

只需确保 temps 可以容纳至少 3 个元素,就是这样,并且 num 不为零或未定义(测试 的返回值scanfnum 的值)。您可以在您的案例中使用 sizeof 公式来避免对值进行硬编码,只是因为您有一个指针数组,而不是指针上的指针。

也避免强制转换 malloc 的返回值。并使用元素的大小,而不是硬编码为 int(因此,如果指针的类型发生变化,您的大小仍然是正确的)。分配改进建议:

for(ctr = 0; ctr < (int)(sizeof(temps)/sizeof(*temps)); ctr++)
  {
     puts("how many readings for the city?");
     if (!scanf(" %d", &num) || num <= 0) { printf("wrong number\n"); exit(1); } // or better error handling
     temps[ctr] = malloc(num * sizeof(*temps[ctr]));

如果您在填充数组时破坏了内存,那么在调用 free 时您可能仍然会遇到段错误(评论表明确实如此,因为 num2 会不断增长)。如果您遇到此类错误,请使用 valgrind 运行您的代码,或者只执行分配/取消分配(而不是其余部分)以查找导致问题的代码部分。

关于c - 如何为指向 int 的指针数组正确释放动态分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53964283/

相关文章:

不使用指针的C编程队列

c - 初始化 block 部分不允许声明

c - mvwprintw 在 for 循环中意外执行

无法读取由 malloc 创建的字符串

c - 释放一维数组内存的函数

c - 静态分配的数组在分配超出范围的值时不会溢出

c - malloc 为 List 分配内存

alignment - malloc 与 posix_memalign

c - 负索引;释放时出错

c - free() 上的段错误