我有下面的代码,这是抛出分割错误。请建议可以做些什么。
#include <stdio.h>
int main() {
char *p ,*q ;
p =(char *)malloc(20) ;
*p = 30 ;
p++ ;
p=q ;
free(q) ;
return 0;
}
谢谢
您正在释放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和integer的问题。这是一样的:
您只能将malloc
返回的精确值free
你从来没有初始化你要释放的q
指针,这就是为什么你的程序会出现分段错误:它会尝试随机free
一个未初始化的指针。
您没有将q初始化为malloc-ed的区域,然后您也丢弃了p(执行p = q)。您需要将指针保存到malloed区域,以便能够释放它。比如
p = q = malloc(...);
// play with p, or q, but not with both
free( /* the one you have not played with */ );
释放指向未定义地址的q。你可能需要写
q=p;
p ( p++; )
所以释放q对你所有的代码都是有意义的(保留原始指针来释放它)
我之前告诉过你原因,但现在让我更清楚地告诉你。记住这些注意事项,free()不适用于普通指针,它只适用于malloc(),calloc()和realloc()中涉及的指针。free()的开发方式只适用于动态内存分配概念。如果你尝试用一个正常的指针使用它,它会导致分割错误或核心转储在基于linux的操作系统中,这是因为这个函数是这样定义的,因为你试图释放一个由q指向的内存,但q是未初始化的,你不知道它指向的地址,你甚至不知道要释放的内存大小。这就是错误所在。我希望你能理解。还有一件事人们可能会说
int main ()
{
= 45 int;
int * q =和;
自由(q);
}
有些人可能会想问上面的问题,说q在上面的代码中被初始化了,它指向a,现在为什么free()不起作用。因为我已经告诉过你free()只适用于动态内存分配函数。在上面你指向的是整型a,但是注意,整型a,是一个静态分配的变量。因此错误仍然存在。但是,当您移动到其他语言时,即使它不涉及动态分配,您也将使用delete操作符来删除它。人们给我一个通知,上面的代码可以工作。有些编译器是可以的,但这些编译器不是用于实际应用的。我建议你使用gcc编译器,