malloc函数崩溃

时间:2012-01-22 16:48:26

标签: c

我使用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: 看来这个问题比我想象的要复杂得多。如果有人有足够的时间帮助我:

这是所有代码

Proj

(这是代码:: blocks 10.05项目,但你可以编译没有ide的源代码,它是纯C而没有任何库):

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

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

我在教育工作中做项目,您可以不受任何限制地使用源代码。

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

3 个答案:

答案 0 :(得分:1)

从错误消息中看起来您的if语句实际上并不是您在此处发布的内容。它表明您的if语句可能是这样的:

if(s=0) {
}

注意单=(赋值)而不是==(相等)。

答案 1 :(得分:1)

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

我还建议您释放在此功能之外为str1str2str3分配的内存,否则您可能会在其他地方遇到麻烦。


编辑:在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)

您不能对freemalloccalloc未创建的指针使用realloc。从Manpage:

  

free()释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。