gpt4 book ai didi

c - 连续调用同一数组时出现奇怪的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:45:26 24 4
gpt4 key购买 nike

我非常努力地寻找解决方案,但我想不出足够好的关键字。

目前我很难理解 makeargv 背后的概念及其与三重指针的用法(我不知道 ***foo 是什么意思,它似乎不像 **foo 或 * 那样容易理解富)。所以我自己做了:

const char **makeargv(char *string, int *numargs) {
string = string + strspn(string, delims);
char *copy = malloc(strlen(string) + 1);
int i;
strcpy(copy, string);

int numtokens;
if (strtok(copy, delims) != NULL) {
for (numtokens = 1; strtok(NULL, delims) != NULL; numtokens++) {}
}

strcpy(copy, string);

const char *results[numtokens+1];

results[0] = strtok(copy, delims);

for (i = 1; i < numtokens; i++) {
results[i] = strtok(NULL, delims);
}

results[numtokens+1] = NULL;
*numargs = numtokens;
return results;
}

这是它中断的部分:

void parse_file(char* filename) {
char* line = malloc(160*sizeof(char));
FILE* fp = file_open(filename);
int i = 0;
int numargs = 0;
int *pointer = &numargs;


while((line = file_getline(line, fp)) != NULL) {
if (strlen(line) == 1){
continue;
}

const char **args = makeargv(line, pointer);

printf("%s\n", args[0]);
printf("%s\n", args[1]);
/* This prints out args[0], but then args[1] causes a seg fault. Even if I replace
the args[1] with another args[0] it still causes a seg fault */

}
fclose(fp);
free(line);
}

我有一个有效的字符串数组。但是,当我尝试打印出数组中的字符串时,我只能打印我选择的 1 个,然后它会为任何后续调用段错误。假设我的字符串数组是 argv[3] = {"Yes", "no", "maybe"},如果我调用 argv[0],它会让我调用“Yes”,但任何其他调用(即使我再次调用 argv[0])不起作用并导致段错误。我可以调用数组中的任何元素,但一旦我调用其中一个,其余元素就会停止工作,从而导致段错误。

请帮忙? D:这是在 C 中。

最佳答案

const char *results[numtokens+1];

这个数组“results”是一个局部变量,它只在“makeargv”内部可用。

你最好使用malloc:

results = malloc(numtokens+1)

而且我相信您的代码中存在内存泄漏。您将无法释放“char *copy”的内存

char *copy = malloc(strlen(string) + 1);

关于c - 连续调用同一数组时出现奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21843532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com