奇怪的seg故障,可能与realloc

时间:2017-12-20 19:53:58

标签: c debugging segmentation-fault

char *dumpTB (TB tb){

    char* text = malloc(sizeof(char));

    int i = 0; // 
    int x = 0; //string index

    tNode* curr = tb->head;

    while(curr != NULL){

        while(curr->line[x] != '\n'){
            printf("%d", i);
            text[i] = curr->line[x];
            printf("%c\n", text[i]);

            text = realloc(text, i+1);

            i++;
            x++;
        }
        text[i] = '\n';
        printf("%c", text[i]);
        text = realloc(text, i+1); 
        i++;

        x = 0; 
        curr = curr->next; 
    }

    return text;
}

所以我设法使用print语句打印出我的字符串的前12个字母但由于某种原因它在打印第12个字母'l'后不久就给我一个seg错误,并且基于打印语句它似乎发生了在realloc周围...谁能告诉我我做错了什么?

int i = 1; // 
    int x = 0; //string index

    tNode* curr = tb->head;

    while(curr != NULL){

        while(curr->line[x] != '\n'){
            printf("%d", i-1);
            text[i-1] = curr->line[x];
            printf("%c\n", text[i-1]);

            text = realloc(text, i+1);
            i++;
            x++;
        }
        printf("%d\n", i-1);
        text[i-1] = '\n';
        printf("%c", text[i-1]);
        text = realloc(text, i+1); 
        i++;

        x = 0; 
        curr = curr->next; 
        //printf("%c\n", curr->line[0]);
    }

我尝试修复索引错误,这是一个非常长的sysmalloc断言事件,它会中止该程序。

1 个答案:

答案 0 :(得分:1)

你可能想要getline(3),所以use如果你拥有它。正如AnT's answer所解释的那样,由于undefined behavior,您有buffer overflow(UB)。尽快解决这个问题。非常{4}的UB并且花更多的时间来阅读它(这很棘手)。

另外,请记住,scaredmalloc(3)都是昂贵的电话(对于一些合适的昂贵概念;实际上,它们非常快 - 在桌面上通常不到一微秒才能合理使用) ,他们可能会失败(通过提供NULL),你应该realloc(3)那个。

在实践中,您最好不要经常使用realloc。根据经验,您希望在某处保留使用的长度和分配的大小(例如,在其他局部变量中),并且您可以使用一些几何级数(例如newsize = 4*oldsize/3 + 10 ....)以避免过于频繁realloc - 秒。为每个附加字节执行realloc是很难看的。

使用所有警告和调试信息编译代码,例如: gcc -Wall -Wextra -g gdb var productData = jQuery(data.replace(/(<script.*?)(<\/script>)/gs, "")).find('.product-essential'); 。改进代码以获得警告。 check {{1}}和GCC寻找Use the debugger等问题。