我有下面的代码,它引发了一个分段错误。请建议可以做些什么。
#include <stdio.h>
int main() {
char *p ,*q ;
p =(char *)malloc(20) ;
*p = 30 ;
p++ ;
p=q ;
free(q) ;
return 0;
}
由于
答案 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编译器,