C-奇怪的SEG故障,可能与Realloc在一起


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("%cn", 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;
}

因此,我设法使用打印语句打印了字符串的前12个字母围绕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("%cn", text[i-1]);
            text = realloc(text, i+1);
            i++;
            x++;
        }
        printf("%dn", i-1);
        text[i-1] = 'n';
        printf("%c", text[i-1]);
        text = realloc(text, i+1); 
        i++;
        x = 0; 
        curr = curr->next; 
        //printf("%cn", curr->line[0]);
    }

我尝试修复了索引错误,这是一个非常长的sysmalloc断言的东西,它逐渐流产。

您可能想要getline(3),因此,如果有的话,请使用它。正如Ant的答案所解释的那样,由于缓冲区溢出,您的行为(UB)不确定。尽快解决该问题。非常害怕UB,花更多的时间阅读(这很棘手)。

另外,请记住,Malloc(3)和Realloc(3)都是昂贵的电话(对于某些合适的昂贵概念;实际上,它们非常快 - 通常比桌面上的微秒少,以供合理使用),并且他们可能会失败(通过给出NULL),您应该检查一下。

实际上,您最好更少使用realloc。根据经验,您希望同时将使用的长度和分配的大小保持在某个地方(例如,在其他局部变量中),并且您可能会使用一些几何进程(例如newsize = 4*oldsize/3 + 10 ....)避免过于频繁的realloc -S。为每个附加字节进行realloc是丑陋的。

使用所有警告和调试信息编译您的代码,例如gcc -Wall -Wextra -g与GCC。改进代码,以免发出警告。使用调试器gdb和Valgrind来狩猎内存泄漏和其他麻烦。

相关内容

  • 没有找到相关文章