好吧,我很困惑,急需帮助。我正在进行一项动态分配字符串数组的任务,而我一直在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: %dn", tokenResult);
for (i < tokenResult; i++;)
{
printf("arg(%d): %sn", 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] != ' '))
{
token[i - lastSpace - subFromPos] = s[i];
if (s[i] == ' ')
{
token[i - lastSpace] = ' ';
*args = realloc(*args, (numTokens + 1));
//printf("the seg fault hasnt happened yet 1n");
args[numTokens] = NULL;
args[numTokens] = realloc(args[numTokens], (i - lastSpace + 1));
//printf("the seg fault hasnt happened yet 2n");
*args[numTokens] = token;
printf("Saved Token: %sn", *args[numTokens]); //test to see if the token got written properly
numTokens++;
lastSpace = i;
subFromPos = 1;
}
//printf("%cn", s[i]);
//printf("Token: %sn", token);
//printf("the seg fault hasnt happened yetn");
i++;
}
numTokens++;
return numTokens;
}
您尚未初始化tokenarray
char **tokenArray;
所以当你在上面调用realloc时,你就是在调用UB。realloc的参数必须为NULL或有效的堆指针。做这个
char **tokenArray = NULL;
并修复环路