7

我在一些动态内存分配方面遇到了一些麻烦。

下面只是我一直在尝试解决问题的测试代码(这与我当前项目的代码中的问题相同,这只是一种更简单的显示方式)。

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>

int main(){

    int x = 5;
    int *ptr = (int*) malloc(sizeof(int));
    assert(ptr != NULL);
    ptr = &x;

    printf("x = %d\n",x);

    *ptr = 3;
    printf("x = %d\n",x);

    free(ptr);

    return 0;
}

该程序编译得很好,运行时我得到正确的输出打印“x = 5 x = 3”但是我得到了错误:

glibc detected  ./dnam: free(): invalid pointer: 0xbfccf698

dnam 是测试程序的名称。根据我所读到的有关该错误的信息,它可能是由于释放了您没有 malloc/calloc/realloc 的内存造成的。

此错误消息后跟回溯和内存映射。在内存映射的末尾,我被告知程序已中止(核心转储)。

4

3 回答 3

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

   ptr = &x;

你正在改变ptr价值!如果你试图释放它,编译器将无限报复。

这里:

free(ptr);

您正在free-ing 一个未通过malloc.

于 2013-11-12T22:39:34.683 回答
1

您正在分配内存并将其地址保存到 ptr 中。然后,您使 ptr 指向 x 的地址,因此当您运行时,free(ptr)您实际上是 freeing &x,这是行不通的。

tl; dr:当您为指针分配指向另一个变量的指针时,malloc不需要。free

于 2013-11-12T22:43:45.340 回答
0

如果您想使用此代码。我认为您应该使用临时指针保存 init ptr.at last free(temp).like this:

 int *temp = ptr;


  free(temp);
于 2015-12-22T12:35:09.627 回答