realloc 表示无效指针,除非不相关的 for 循环被注释掉

realloc says invalid pointer unless unrelated for-loop commented out

好吧,我很困惑,急需帮助。我正在做一项动态分配字符串数组的作业,但我一直在使用 realloc 遇到麻烦。我终于达到了它似乎可以工作的地步,我只需要编写 for 循环来正确显示结果。

否则,代码将停止工作。它会让我输入字符串,与我之前用来测试它的字符串完全相同,程序会崩溃,说 realloc 遇到了无效指针的问题。每当我再次评论 for 循环时,一切似乎都运行良好。

这可能是一些愚蠢的事情,或者是我对 realloc 不了解的结果,但我 运行 没时间了,各种搜索都没有返回任何我认为适用的答案,所以我想我应该在这里问。

我用来测试它的输入是“你好,我真正的朋友”这一行。

这是我的代码(是的,我知道,一团糟,抱歉。通常我对这些事情会好一点,但我非常匆忙):

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int MAXSTRING = 255;

int makearg(char s[], char **args[]);

int main()
{
   char **tokenArray;
   char strInput[MAXSTRING];
   int tokenResult;
   int i = 0;

   printf("Input String to be Parsed: ");
   scanf("%[^\n]%*c", strInput);

   tokenResult = makearg(strInput, &tokenArray);

   printf("argc: %d\n", tokenResult);
   for (i < tokenResult; i++;)
   {
      printf("arg(%d): %s\n", i, tokenArray[i][1]);
   }
}

int makearg(char s[], char **args[])
{
   int numTokens = 0;
   int lastSpace = 0;
   int i = 0;
   char token[MAXSTRING];
   int subFromPos = 0;
   while ((s[i] != '\n') && (s[i] != '[=10=]'))
   {
      token[i - lastSpace - subFromPos] = s[i];
      if (s[i] == ' ')
      {
         token[i - lastSpace] = '[=10=]';
         *args = realloc(*args, (numTokens + 1));
         //printf("the seg fault hasnt happened yet 1\n");
         args[numTokens] = NULL;
         args[numTokens] = realloc(args[numTokens], (i - lastSpace + 1));
         //printf("the seg fault hasnt happened yet 2\n");
         *args[numTokens] = token;
         printf("Saved Token: %s\n", *args[numTokens]); //test to see if the token got written properly
         numTokens++;
         lastSpace = i;
         subFromPos = 1;
      }
      //printf("%c\n", s[i]);
      //printf("Token: %s\n", token);
      //printf("the seg fault hasnt happened yet\n");
      i++;
   }
   numTokens++;
   return numTokens;
}

你还没有初始化tokenarray

char **tokenArray;

因此,当您对其调用 realloc 时,您正在调用 UB。 realloc 的参数必须是 NULL 或有效的堆指针。这样做

char **tokenArray = NULL;

并修复 for 循环