所以这是一个简单的代码。我不会再解释了。我的问题是,如果我使用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
的指针值必须是malloc
、calloc
或realloc
返回的值。在这种情况下,您用i
的地址重新分配了ptr
,这是而不是*alloc
调用的结果。请注意,在这个过程中,您丢失了对动态分配内存的唯一引用,因此以后无法释放它;这被称为内存泄漏。
如果你做类似ptr++
的事情,你会遇到同样的问题——你仍然指向动态分配的块,但它不是*alloc
返回的地址,所以你会得到同样的错误。