realloc() 无效的下一个大小 - 再一次,我知道
realloc() invalid next size - AGAIN, I know
是的,这又是其中一个问题,我知道互联网上充斥着这个特定的问题,但我在其他线程中找不到解决该问题的方法,所以我来了。
我在这段代码中遇到了 "realloc() invalid next size" 错误,它解析了一些文本并将单个单词放入字符串数组 argv 中。这段代码非常简单,要使这段代码更好,还有很多工作要做,我完全清楚这一点。
无论如何,当我超过一定数量的 char **argv 变量重新分配时,我会收到此错误。有趣的是,它取决于我 运行 它所在的软件。例如,使用 CLion,当我尝试解析 5 个单词的文本时出现此错误,而在 Visual Studio 中,它是 3 个单词的文本当我收到此错误时的话。
所以这是代码,它有3个参数,第一个是一个字符串,一个文本所在的缓冲区。接下来的2个参数通过引用传递,分别是argc和argv。
这是对函数的调用:
char **argv = NULL;
int argc = 0;
//buffer is a string terminated with a zero
parse_line(buffer, &arc, &argv);
这是函数:
int parse_line(char *buffer, int *argc, char ***argv) {
int arg_cap = 10;
*argv = malloc(sizeof(char*));
(*argv)[0] = malloc(arg_cap);
int index_iter = 0;
for (int i = 0; buffer[i]; i++) {
if (buffer[i] == ' ') {
(*argv)[*argc][index_iter] = 0;
(*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);
index_iter = 0;
arg_cap = 10;
(*argc)++;
*argv = realloc(*argv, sizeof(char*) * (*argc));
(*argv)[*argc] = malloc(arg_cap);
}
else {
index_iter++;
if (index_iter >= arg_cap) {
arg_cap *= 2;
(*argv)[*argc] = realloc((*argv)[*argc], arg_cap);
}
(*argv)[*argc][index_iter-1] = buffer[i];
}
}
(*argv)[*argc][index_iter] = 0;
(*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);
(*argc)++;
return 1;
}
希望你能弄清楚问题出在哪里。谢谢大家。
行:
*argv = realloc(*argv, sizeof(char*) * (*argc));
应该是:
*argv = realloc(*argv, sizeof(char*) * (1 + *argc));
插入第一个参数并递增 *argc
后,您的代码将 realloc
数组只包含一个指针,而现在您需要两个。
是的,这又是其中一个问题,我知道互联网上充斥着这个特定的问题,但我在其他线程中找不到解决该问题的方法,所以我来了。
我在这段代码中遇到了 "realloc() invalid next size" 错误,它解析了一些文本并将单个单词放入字符串数组 argv 中。这段代码非常简单,要使这段代码更好,还有很多工作要做,我完全清楚这一点。
无论如何,当我超过一定数量的 char **argv 变量重新分配时,我会收到此错误。有趣的是,它取决于我 运行 它所在的软件。例如,使用 CLion,当我尝试解析 5 个单词的文本时出现此错误,而在 Visual Studio 中,它是 3 个单词的文本当我收到此错误时的话。
所以这是代码,它有3个参数,第一个是一个字符串,一个文本所在的缓冲区。接下来的2个参数通过引用传递,分别是argc和argv。
这是对函数的调用:
char **argv = NULL;
int argc = 0;
//buffer is a string terminated with a zero
parse_line(buffer, &arc, &argv);
这是函数:
int parse_line(char *buffer, int *argc, char ***argv) {
int arg_cap = 10;
*argv = malloc(sizeof(char*));
(*argv)[0] = malloc(arg_cap);
int index_iter = 0;
for (int i = 0; buffer[i]; i++) {
if (buffer[i] == ' ') {
(*argv)[*argc][index_iter] = 0;
(*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);
index_iter = 0;
arg_cap = 10;
(*argc)++;
*argv = realloc(*argv, sizeof(char*) * (*argc));
(*argv)[*argc] = malloc(arg_cap);
}
else {
index_iter++;
if (index_iter >= arg_cap) {
arg_cap *= 2;
(*argv)[*argc] = realloc((*argv)[*argc], arg_cap);
}
(*argv)[*argc][index_iter-1] = buffer[i];
}
}
(*argv)[*argc][index_iter] = 0;
(*argv)[*argc] = realloc((*argv)[*argc], index_iter+1);
(*argc)++;
return 1;
}
希望你能弄清楚问题出在哪里。谢谢大家。
行:
*argv = realloc(*argv, sizeof(char*) * (*argc));
应该是:
*argv = realloc(*argv, sizeof(char*) * (1 + *argc));
插入第一个参数并递增 *argc
后,您的代码将 realloc
数组只包含一个指针,而现在您需要两个。