C程序崩溃"没有源可用于" 0xb7e88a81""在malloc线上(Eclipse)

时间:2014-03-17 20:30:02

标签: c eclipse ubuntu gcc malloc

我有一个函数,它接受一个字符串并删除它的某些部分。

这个函数做了几次,直到突然之间,相同的malloc线运行良好,崩溃,没有可用的源#34; 0xb7e88a81"错误。

试图清除所有事情,以确保我没有发送NULL长度或其他什么,但仍然没有运气。

它至少工作了一次(调试过),但在第二次或第三次迭代时它崩溃了。

char *removeOffsetFromLabel (char *label) {
    char* labelWithoutOffset;
    int i;

    labelWithoutOffset = malloc(strlen(label));
   ........

崩溃发生在malloc线上(当试图移动到下一行时)。

strlen(label)= 7(选中)

有什么想法吗?我在Eclipse(Ubuntu)上使用GCC编译器。

Per FoggyDay的请求这是整个功能:

char *removeOffsetFromLabel (char *label) {
char* labelWithoutOffset;
int i;

labelWithoutOffset = (char*)malloc(strlen(label) + 1);
i = 0;
while (label[i] != '\0' && label[i] != OPENING_BRACKET_ASCII_CODE) {
    labelWithoutOffset[i] = label[i];
    i++;
}
labelWithoutOffset[i] = '\0';
return labelWithoutOffset;
}

我释放了" labelWithoutOffset"在再次调用它之前的函数之外。

4 个答案:

答案 0 :(得分:3)

我希望我能用V符号标记你的所有答案,以表明它已经解决了问题,因为你最有帮助。

在深入研究之后,我对代码进行了两处更改,到目前为止似乎工作正常:

  1. 删除了已经释放的指针上使用的两个“免费”命令(愚蠢的错误)
  2. 每次免费后添加“指针= NULL”(只是为了安全起见)
  3. 再一次,我感谢大家向我展示了我在代码中遇到的其他问题。

    StackOverflow ROCKS!

答案 1 :(得分:2)

1)如上所述,“malloc()”必须“strlen()+ 1”:

   char *removeOffsetFromLabel (char *label) {
      char* labelWithoutOffset = (char *)malloc(strlen(label)+1);

2)由于这没有解决问题,我们还需要看看:

a)当我们调用strlen()时,“label”是否有效?

b)你有没有可能在其他地方覆盖“labelWithoutOffset”的代码 - 你在一次通话中分配后,再在另一次通话中再次分配它之前?

SUGGESTIONS:

a)添加此代码(或者更好,在调试器中查看“label”):

   char *removeOffsetFromLabel (char *label) {
      fprintf (STDERR, "label=%s\n", label);
      fprintf (STDERR, "strlen(label)=%d\n", strlen(label);
      char* labelWithoutOffset = (char *)malloc(strlen(label)+1);

b)从“removeOffsetFromLabel()”发布更多代码 - 也许我们可以看到变量可能会“踩到”。

PS: 如果您有野心,请查看我上面的Valgrind教程的链接。

但是对于“快速结果”,请尝试建议1)和2);让我们知道它是怎么回事。

答案 2 :(得分:1)

如果strlen(label)确实是7,那么它不是strlen()而是malloc()本身崩溃。

如果malloc()崩溃,那可能意味着malloc()的内部管理在早期/其他地方被破坏(通过指针变得疯狂)。

这样的错误很难(最难)找到,因为你不知道它们在哪里,因为崩溃可能在事故发生很久之后发生。

您可能希望了解Valgrind的用法。

答案 3 :(得分:-2)

抓一点。

我不明白那里有什么函数类型,但据我所知的malloc();和字符串,因为label是一个数组,你应该像这样发送它

void funcCall(int *)
main()
{
    funcCall(label)
}
funcCall(int funcLabel[])
{

}

希望这会有所帮助。