代码在 realloc() 上崩溃,我不明白为什么,分段错误(核心已转储)

Code crashes on realloc(), and I can't figure out why, segmentation fault (core dumped)

我正在尝试编写一个程序来读取输入并每行打印 60 个字符,并使用一个指针来存储字符。 而且我在输入很多字符时总是出现分段错误,我认为是 realloc() 导致的,但我不明白为什么。

这是我的代码(有点长,但如果有人能帮助我,我将不胜感激): 忽略空函数。

int main() {
    int opt;
    char *p;
    int checkRead = -1;
    
    
    p = (char*) calloc(60,1);
    
    scanf("%d",&opt);
    
    checkRead = readText(opt,p);
    if (!checkRead) {
        
}

int readText(int opt, char *p) {
    switch(opt) {
        case dynamicList:
             return dynamicReadText(p);
    return 1;
}

int dynamicReadText(char *p) {
    register int i;
    int ch;
    char *checker = NULL;
    fflush(stdin);
    
    for (i = 0; (ch = getchar()) != EOF; i++) {
        if (i >= 60 && i % 60 == 0) {
            checker = (char*)realloc(p,i+60);
            if (!*(checker)) {
                return 0;
            }
            p = checker;
            free(checker);
            checker = NULL;
            *(p+i) = '\n';
            i++;
        }
        if (ch == '\n') {
            i--;
        }
        else {
            *(p+i) = ch;
        }
    }
    *(p+i) = '[=10=]';
    
    return 1;
}

问题多多


checker = (char*)realloc(p,i+60);
if (!*(checker))

应该是

checker = (char*)realloc(p,i+60);
if (!checker)

您想检查 realloc 返回的值是否为 NULL。您正在检查内存块的第一个字符是否为零。


第二个问题可能是导致 SIGSEGV 的问题。

Select 行代码:

char *checker = NULL;
checker = (char*)realloc(p,i+60);  // Allocates a memory block.
p = checker;                       // Both p and checker points to this block.
free(checker);                     // The block is freed.
*(p+i) = '\n';                     // XXX Derefs a pointer pointing to freed memory.

最后,您正在更改 dynamicReadTextp,期望这会更改 readText 中的 p。同样,您希望更改 readTextp 将更改 main 的。但这些是完全不同的变量。 C 总是按值传递。


好吧,我最后说了,但只是在这个答案涵盖的范围内。我还没有确定没有其他问题。

总而言之,您的代码应如下所示:

int f(char **p_ptr) {
   ...

   while (...) {
      ...

      char* tmp = realloc(*p_ptr, ...);
      if (!tmp) {
         ...
      }

      *p_ptr = tmp;

      ...
   }

   ...
}

int main(void) {
   char *p = NULL;
   f(&p);

   ...

   free(p);
}