gpt4 book ai didi

c - malloc函数崩溃

转载 作者:行者123 更新时间:2023-11-30 14:26:34 25 4
gpt4 key购买 nike

我在使用 malloc 分配内存时遇到问题。这是我的代码的一个片段:

    printf("DEBUG %d\n",L);
char *s=(char*)malloc(L+2);
if(s==0)
{
printf("DEBUGO1");
}
printf("DEBUGO2\n");

它输出“DEBUG 3”,然后出现错误消息框并显示以下消息:

The instruction at 0x7c9369aa referenced memory at "0x0000000". The memory could not be read

对我来说这样的行为很奇怪。这里可能出了什么问题?

该应用程序是单线程的。

我使用的是 code::blocks 10.05 中内置的 mingw C 编译器

如果需要的话我可以提供所有代码。谢谢。

UPD1:还有更多代码:

char *concat3(char *str1,char *str2,char *str3)
{
/*concatenate three strings and frees the memory allocated for substrings before*/
/* returns a pointer to the new string*/

int L=strlen(str1)+strlen(str2)+strlen(str3);
printf("DEBUG %d\n",L);
char *s=(char*)malloc(L+2);
if(s==0)
{
printf("DEBUGO1");
}
printf("DEBUGO2\n");
sprintf(s,"%s%s%s",str1,str2,str3);
free(str1);
free(str2);
free(str3);
return s;
}

UPD2:看来问题比我想象的还要复杂。只要有人有足够的时间来帮助我:

这是所有代码

Proj

(这是code::blocks 10.05项目,但是你可以在没有ide的情况下编译源代码,它是纯C语言,没有任何库):

将该程序称为“cbproj.exe s.pl”(s.pl 文件位于存档的根目录中)

当它调用“parser.tab.c”第 113 行(函数 concat3 所在的位置)上的函数“malloc”时,您可能会看到它崩溃。

我做这个项目是出于教育目的,您可以不受任何限制地使用源代码。

UPD3:问题是它没有为程序中的一个字符串分配足够的内存,但它似乎一直工作到下一个 malloc。哦,我现在讨厌 C:)我同意关于糟糕的编码风格的评论,需要在这方面改进自己。

最佳答案

这段代码的问题在于,当malloc失败时,您不会从函数返回,而是在sprintf调用中进一步使用这个NULL指针作为缓冲区.

我还建议您在此函数之外释放分配给 str1str2str3 的内存,否则您可能会将自己置于在其他地方遇到麻烦。

<小时/>

编辑:在 valgrind 下运行程序后,发现了两个真实问题(在 parser.tab.c 中):

yyuserAction中,

char *applR=(char*)malloc(strlen(ruleName)+7);
sprintf(applR,"appl(%s).",ruleName);

+7 是不够的,因为您还需要在字符串末尾留出\0 字符的空间。使其+8 有所帮助。

SplitList中,

char *curstr=(char*)malloc(leng);

有可能分配零字节。 leng + 1 有帮助。

经过上述更改后,一切运行正常(如果有人可以这么说,因为我不会计算内存泄漏)。

关于c - malloc函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8962733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com