为什么运行此代码时收到无效的指针错误

时间:2020-05-12 16:34:56

标签: c pointers free

运行此代码时收到以下错误。

“ 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;
}

3 个答案:

答案 0 :(得分:2)

int c=10;

变量 c 在堆栈上分配。

ptr = (int*)malloc(sizeof(int));

将堆上已分配内存的地址分配给 ptr

ptr = &c;

c 的地址分配给 ptr


您的代码中有两个问题。

  1. 内存泄漏。由于您使用了 ptr 的重新分配,因此丢失了已分配内存的地址。在这种情况下,除非程序结束,否则您无法释放堆上分配的内存。
  2. 您无法使用 free()功能释放堆栈上分配的内存。它是自动变量

因此,如果您尝试将 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);
}

结论: 如果要分配用于存储指针的指针,则需要分配一个指向该指针的指针,以便保留已分配内存的指针,以便在不再需要该内存时可以释放该内存