C:双指针的重新分配问题

标签 c realloc

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

我不断收到*** glibc detectors *** ./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);
         }

最佳答案

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

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] 写入过多内容而导致缓冲区溢出。我建议重新设计这段代码以确保它永远不会溢出。

关于C:双指针的重新分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811956/

相关文章:

c - 按值返回与按引用返回时有哪些注意事项 - Set ADT C

c# - C 中的地理编码查找

C 重新分配错误

c++ - 奇怪的重新分配行为

c - 使用动态数组进行 realloc() 后的意外行为

c - 读取输入并不能完全填充 double 组

objective-c - 在 Objective-C 中我可以将属性视为数组吗?

c - 在 C 中使用 realloc 按字符读取输入字符

c - 重新分配() : Invalid pointer in C

C 局部和全局静态变量