运行此代码时收到以下错误。
“ main”中的错误:free():无效的指针:
我的想法是使用通过malloc分配的指针。这是示例代码。 请让我知道为什么我会收到此错误。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int c=10;
int* ptr = NULL;
ptr = (int*)malloc(sizeof(int));
if(ptr == NULL)
{
printf("Memory not allocated");
exit(0);
}
ptr = &c;
free(ptr);
ptr=NULL;
}
答案 0 :(得分:2)
int c=10;
变量 c 在堆栈上分配。
ptr = (int*)malloc(sizeof(int));
将堆上已分配内存的地址分配给 ptr
ptr = &c;
将 c 的地址分配给 ptr 。
您的代码中有两个问题。
因此,如果您尝试将 c 的值分配给分配的空间:
*ptr = c;
答案 1 :(得分:1)
为什么会收到无效的指针错误?
因为您free
没有用malloc
(或realloc
)分配的指针。
您有一个内存泄漏,即丢失了一个用ptr = &c
分配的指针,该指针将c
的地址分配给ptr
,丢失了返回的值由malloc
。
答案 2 :(得分:0)
要做的是,您需要为这样的指针分配一个指针
#include <stdio.h>
#include <stdlib.h>
int main() {
int c=10;
int** ptr = NULL;
ptr = (int**)malloc(sizeof(int*));
if(ptr == NULL)
{
printf("Memory not allocated");
exit(0);
}
*ptr = &c;
free(ptr);
ptr=NULL;
}
在您释放非动态分配的内存的情况下,这会给您带来错误,即使在其他情况下,也应始终保留分配的内存的地址以在您不再需要它时释放它的问题
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr1 = (int*)malloc(sizeof(int));
int *ptr2 = (int*)malloc(sizeof(int));
*ptr1 = 5;
*ptr2 = 10;
// this is wrong because now there is no way to free
// the address of the allocated memory to ptr1
ptr1 = ptr2;
free(ptr1);
// this gives an error because ptr2 is already free
free(ptr2);
}
结论: 如果要分配用于存储指针的指针,则需要分配一个指向该指针的指针,以便保留已分配内存的指针,以便在不再需要该内存时可以释放该内存