调用free()抛出分段错误

时间:2011-07-07 10:48:20

标签: c unix malloc free

我有下面的代码,它引发了一个分段错误。请建议可以做些什么。

#include <stdio.h>

int main() {
    char *p ,*q ;

    p =(char *)malloc(20) ;
    *p = 30 ;
    p++ ;
    p=q ;

    free(q) ;

    return 0;
}

由于

5 个答案:

答案 0 :(得分:6)

您正在释放malloc未归还的内容(q永远不会被初始化)。我也可以看到你在做什么

p++

执行此操作时,您正在失去p并且您无法再将其释放。万一你的意思是q=p无效。您只能释放malloc返回的内容。

修改

根据评论,OP 似乎打算q = p。你可以这样做:

char *p;
char *save_p;

p = malloc(10); /* stop casting malloc */
save_p = p; /* save the original value of p BEFORE altering it */

/* use p to your heart's content */

free(save_p); /* it's legal to free this */

我看到你问的是关于char与整数的问题。它是一样的:

您只能free malloc返回的确切值。

答案 1 :(得分:3)

你正在释放q,指向一个未定义的地址。您可能需要写的是

q=p;
在递增p ( p++; )

之前

所以释放q对你的所有代码都有意义(保留原始指针以释放它)

答案 2 :(得分:3)

你永远不会初始化你正在释放的q指针,这就是你的程序段错误的原因:它试图free一个随机的未初始化指针。

答案 3 :(得分:2)

你没有将q初始化到malloc-ed区域,然后你也垃圾p(做p = q)。您需要将指针保存到malloc-ed区域才能释放它。像

这样的东西
p = q = malloc(...);
// play with p, or q, but not with both
free( /* the one you have not played with */ );

答案 4 :(得分:1)

之前我告诉你的原因现在让我更清楚地告诉你。记住这些arpita,free()不能正常使用指针,它只适用于malloc(),calloc()所涉及的指针free()的开发方式只适用于动态内存分配概念。如果你尝试将它与普通指针一起使用,会导致分段错误或基于linux的操作系统转储核心,这是因为函数以这种方式定义,因为你试图释放q指向的内存,但q未初始化你不知道它指向的地址,你甚至不知道要释放的内存大小。所以他们的谎言是我希望你理解。还有一件事 人们可能在说

int main()

{

int a = 45;

int * q =&amp; a;

自由(Q);

}

有些人可能会思考并问上面的问题,说q在上面的代码中初始化它指向a,现在为什么free()不是woking.Because我已经告诉过你free()只能用于动态内存分配功能。在上面你指的是int a,但请注意int a是一个静态分配的变量。因此,仍然存在错误。

但是,当你转移到其他语言时,你将有删除操作符删除它,即使它没有参与动态分配。人们给我带来上述代码有效的通知。并且我对一些编译器说是,但编译器不适用于真正的应用程序。我建议你使用gcc编译器,