我使用malloc进行内存分配时遇到问题。 这是我代码中的一个片段:
printf("DEBUG %d\n",L);
char *s=(char*)malloc(L+2);
if(s==0)
{
printf("DEBUGO1");
}
printf("DEBUGO2\n");
输出“DEBUG 3”,然后出现错误信息框,并显示以下消息:
0x7c9369aa处的指令引用“0x0000000”处的内存。该 内存无法读取
对我来说这种行为很奇怪。 这可能有什么问题?
该应用程序是单线程的。
我正在使用内置于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: 看来这个问题比我想象的要复杂得多。如果有人有足够的时间帮助我:
这是所有代码
(这是代码:: blocks 10.05项目,但你可以编译没有ide的源代码,它是纯C而没有任何库):
将程序称为 “cbproj.exe s.pl”(s.pl文件位于arhive的根目录中)
并且当它调用“parser.tab.c”(编写函数concat3)的第113行上的函数“malloc”时,您可能会看到它崩溃。
我在教育工作中做项目,您可以不受任何限制地使用源代码。
UPD3: 问题是它没有为程序中的一个字符串分配足够的内存,但它似乎工作到下一个malloc ..哦,我现在讨厌C :) 我同意关于不良编码风格的评论,需要在此提高自己。
答案 0 :(得分:1)
从错误消息中看起来您的if
语句实际上并不是您在此处发布的内容。它表明您的if
语句可能是这样的:
if(s=0) {
}
注意单=
(赋值)而不是==
(相等)。
答案 1 :(得分:1)
这个确切代码的问题是,当malloc
失败时,您不会从函数返回,而是在sprintf
调用中进一步使用此NULL指针作为缓冲区。
我还建议您释放在此功能之外为str1
,str2
和str3
分配的内存,否则您可能会在其他地方遇到麻烦。
编辑:在valgrind下运行程序后,发现了两个真正的问题(在parser.tab.c中):
在yyuserAction
,
char *applR=(char*)malloc(strlen(ruleName)+7);
sprintf(applR,"appl(%s).",ruleName);
+7
不足,因为在字符串末尾还需要\ 0 char的空格。让+8
帮助。
在SplitList
,
char *curstr=(char*)malloc(leng);
有可能分配零字节。 leng + 1
有帮助。
经过上述修改后,一切运行正常(如果可以这样说,因为我不打算计算内存泄漏)。
答案 2 :(得分:0)
您不能对free
,malloc
或calloc
未创建的指针使用realloc
。从Manpage:
free()释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。