【发布时间】:2020-07-04 20:22:52
【问题描述】:
在下面的代码中,有两个 int 数组被分配到另一个函数中(我想检查我是否可以释放任何指针,或者只能释放本地分配的指针)。两个数组都以某种方式链接,我不明白为什么?
#include <stdlib.h>
#define LEN 10
int* foo(int*, int);
void main()
{
int* arr = (int*)malloc(sizeof(int) * LEN);
int* arr2 = foo(arr, LEN);
for (int i = 0; i < LEN; i++)
{
arr2[i] = i;
printf("%d\t", arr2[i]);
}
printf("\n");
for (int i = 0; i < LEN; i++)
{
printf("%d\t", arr[i]);
}
printf("\n");
for (int i = 0; i < LEN; i++)
{
arr[i] = i+1;
printf("%d\t", arr[i]);
}
printf("\n");
for (int i = 0; i < LEN; i++)
{
printf("%d\t", arr2[i]);
}
free(arr2);
}
int* foo(int* arr, int n)
{
free(arr);
return (int*)malloc(sizeof(int) * n);
}
输出是:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
【问题讨论】:
-
在调用
foo(arr, LEN);之后,arr是一个悬空指针,使用它会表现出未定义的行为。实际上,malloc重用最近释放的块是完全正常且不足为奇的。 -
@JohnBollinger:
free可以应用于malloc系列中的例程返回的任何指针值(并且自释放后)或空指针。该行为未定义为将其应用于自动对象、静态对象等的地址。