【问题标题】:C: Realloc issues with double pointerC: 双指针的 Realloc 问题
【发布时间】:2015-04-23 01:25:06
【问题描述】:

我正在尝试将char word[50] 数组复制到char **wordlist 双指针,然后将realloc(wordlist, (numwords+1)*sizeof(char*)) 以将单词列表的大小再增加一个char* 以容纳下一个word

我不断收到*** glibc detected *** ./program: realloc(): invalid next size 错误

我将其声明为wordlist = realloc(wordlist, (numwords+1)*sizeof(char*))

void outFile(char *argv[], char **wordlist)
  {
      if((inFilePtr = fopen(argv[2], "r")) != NULL)
      {
          if((outFilePtr = fopen(endOfFile, "w")) != NULL)
          {
              while((c = fgetc(inFilePtr)) != EOF)
              {
                  if(!(isspace(c)))
                  {
                      word[wordIndex] = c;
                      wordIndex++;
                      rowLim++;
                  }
                  if(isspace(c))
                  {
                      wordIndex = 0;
                      if(rowLim < limit)
                      {
                          rowLim++;
                          strcat(text[rowNum], word);
                          strcat(text[rowNum], " \0");
                          wordlist[numwords] = strdup(word);
                          /*strcat(wordlist[numwords], "\n\0");*/
                          memset(word, 0, 50);
                          prev = rowLim;
                          wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*));
                          numwords++;
                      }
                      else
                      {
                          strcat(text[rowNum], "\n\0");
                          printf("text[%d] = %s",rowNum, text[rowNum]);
                          fputs(text[rowNum], outFilePtr);
                          rowNum++;
                          strcat(text[rowNum], word);
                          strcat(text[rowNum], " \0");
                          /*strcat(wordlist[numwords], word);
                          strcat(wordlist[numwords], "\n\0");
                          wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*));*/
                         numwords++;
                         memset(word, 0, 50);
                         rowLim = rowLim - prev;
                     }
                     wordIndex = 0;
                 }
             }
             strcat(text[rowNum], "\n\0");
             printf("text[%d] = %s",rowNum, text[rowNum]);
             fputs(text[rowNum], outFilePtr);
             fclose(outFilePtr);
         }

【问题讨论】:

  • 怎么样?能详细点吗?
  • 但是numwords被初始化为0,那不是总是分配空间吗?
  • @PythonNoob 发布 MCVE。你在程序的其他地方犯了一个错误,但由于你没有展示程序的其余部分,所以无法说出来。
  • 第一个问题(尽管这绝不是问题的原因),wordlist = realloc(wordlist, (numwords+1)*sizeof(char*)) realloc() 没有像您那样安全地使用。从您发布的代码中无法知道为什么invalid next size... 消息,请发布Minimum Complete Verifiable Example
  • @PythonNoob from your comment但是numwords被初始化为0,那不是总是分配空间吗?,看来我们真的很想看代码.. .

标签: c realloc


【解决方案1】:

您试图在分配空间之前使用它:

wordlist[numwords] = strdup(word);
wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*));
numwords++;

相反,先分配空间:

wordlist = realloc(wordlist, (numwords + 1)*sizeof(char*));
wordlist[numwords] = strdup(word);
numwords++;

注意。正如 iharob 所说,如果您希望能够从内存不足中恢复,那么 realloc 的返回值应该存储在一个单独的变量中,直到您确认它不是 NULL

您所有的\0 都是多余的。字符串文字是字符串:例如 "\n" 表示 { '\n', '\0' } 已经。

从这段代码中无法判断您是否因向text[rowNum] 写入过多而导致缓冲区溢出。我建议重新设计这段代码以确保它永远不会溢出。

【讨论】:

  • 在我的主要方法中,我有:char **wordlist = malloc(sizeof(shar*));
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多