c语言 - 为什么在这种情况下不需要使用 free() 函数?



所以这是一个简单的代码。我不会再解释了。我的问题是,如果我使用free(),它会导致

***`中出错/main':free((:无效指针:0x00007ffee8389f8***错误,

但我不太明白为什么。这是因为我给了ptr一个循环变量地址?如果我删除free()函数调用,它可以很好地工作,但我很好奇是什么原因导致的。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
printf("Give me a number:n");
scanf("%d", &num);
int *ptr = malloc(sizeof(int) * num);
for (int i = 0; i < num; ++i)
{
ptr = &i;
printf("%dn", *ptr);
}
free(ptr);
return 0;
}

来自Valgrind:

肯定输了"。这意味着指向块的指针不能建立该块被分类为"块";丢失";,因为程序员可以不可能在程序退出时释放它,因为没有指向它的指针存在。这可能是在某些位置丢失指针的症状程序中较早的点。此类情况应由程序员

在代码中,指向malloc’ed内存的指针已被修改(ptr = &i(,因此,我们丢失了指向内存的指针。而且,您不应该释放堆栈内存。

传递给free的指针值必须是malloccallocrealloc返回的值。在这种情况下,您用i的地址重新分配了ptr,这是而不是*alloc调用的结果。请注意,在这个过程中,您丢失了对动态分配内存的唯一引用,因此以后无法释放它;这被称为内存泄漏。

如果你做类似ptr++的事情,你会遇到同样的问题——你仍然指向动态分配的块,但它不是*alloc返回的地址,所以你会得到同样的错误。

相关内容

  • 没有找到相关文章

最新更新