需要帮助尝试了解free()函数在C

时间:2016-10-21 19:42:27

标签: c pointers malloc free

我一直在尝试了解free()函数如何工作的一些测试。以下是我的代码,后面是基于我所理解的一些问题。

int n=0,i=0;
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for (i=0;i<n;i++)
{
    A[i]=2*i;
    printf("A[%d] = %d\n",i,*(A+i));

}
printf("Address of A is = %d\n",A);
free(A);
for (i=0;i<n;i++)
{
    printf("%d\n",*(A+i));

}
printf("Address of A is = %d\n",A);

我不明白为什么在free(A)之后,A的值仍然相同?免费后不应该有一些垃圾价值吗?为什么A的地址保持不变?在记忆方面释放A后真的发生了什么?

1 个答案:

答案 0 :(得分:3)

free将内存返回给堆。它没有说明它对内存内容的作用,事实上,通常的行为是“它什么都不做”(也就是说,它不会执行数据本身的读取或写入,只是更新堆跟踪信息将该内存标记为可重用或将其返回给操作系统。

你不应该依赖于此; use-after-free是未定义的行为,因此它可以做任何想做的事情。在实践中,在释放后立即读取大量分配可能会导致故障,而小分配将继续工作,直到新malloc重用该空间,但您不能依赖任何此类,并且它的系统和使用特定模式

如果您访问free内存,那么您做错了,最终会咬你。