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 循环
好吧,我很困惑,急需帮助。我正在做一项动态分配字符串数组的作业,但我一直在使用 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 循环