[英]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.