繁体   English   中英

调用 free() 引发分段错误

[英]Call to free() throwing segmentation fault

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

#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 的问题。 一样的:

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

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

q=p;

递增 p ( p++; )之前

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

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

您不会将 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 */ );

我之前告诉过你的原因现在让我更清楚地告诉你。记住这些 arpita,free() 不适用于普通指针,它只适用于 malloc()、calloc() 和 realloc( ).free() 的开发方式仅适用于动态 memory 分配概念。如果您尝试将其与普通指针一起使用,则会导致分段错误或核心转储在基于 linux 的操作系统中,这是因为 ZC1C425268E68384F14Z0 在 A那样是因为您试图释放 q 指向的 memory 但 q 未初始化,您不知道它指向的地址,您甚至不知道要释放的 memory 的大小。所以他们的错误在于。希望你明白。 还有一件事人们可能会说

主函数()

{

诠释a = 45;

int *q=&a;

免费(q);

}

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

但是,当您迁移到其他语言时,即使它不涉及动态分配,您也将使用 delete 运算符将其删除。人们给我带来了上述代码有效的通知。 我对某些编译器说是,但编译器不适用于真正的应用程序。我建议您使用 gcc 编译器,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM