调用free()抛出分段错误



我有下面的代码,这是抛出分割错误。请建议可以做些什么。

#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编译器,

相关内容

  • 没有找到相关文章

最新更新