我需要知道在尝试为指向 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
不为零或未定义(测试 的返回值scanf
和 num
的值)。您可以在您的案例中使用 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/