0

好的,我很困惑,迫切需要帮助。我正在处理一个动态分配字符串数组的任务,并且我一直在使用 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] != '\0'))
   {
      token[i - lastSpace - subFromPos] = s[i];
      if (s[i] == ' ')
      {
         token[i - lastSpace] = '\0';
         *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;
}
4

1 回答 1

0

你还没有初始化 tokenarray

char **tokenArray;

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

char **tokenArray = NULL;

并修复那个for循环

于 2022-02-22T19:56:16.133 回答