Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
realloc的问题-“;“下一个尺寸无效”;_C_Realloc - Fatal编程技术网

realloc的问题-“;“下一个尺寸无效”;

realloc的问题-“;“下一个尺寸无效”;,c,realloc,C,Realloc,在我的程序中,我从.txt文件接收文本。以下是一行文本的示例: 12X15 de3 ds4 dn9 g2,7 m5,9 m3,1 h2,2 我试图使用strtok()来分解每个文本块;然后,我将把每个块作为数组中的一个元素。所以是一个字符串数组 以下是我目前的代码: void parseFile(char ** argv) { FILE *textFile; char *string; char **lineToken; int i; textFile

在我的程序中,我从.txt文件接收文本。以下是一行文本的示例:

12X15 de3 ds4 dn9 g2,7 m5,9 m3,1 h2,2

我试图使用strtok()来分解每个文本块;然后,我将把每个块作为数组中的一个元素。所以是一个字符串数组

以下是我目前的代码:

void parseFile(char ** argv) {
    FILE *textFile;
    char *string;
    char **lineToken;
    int i;

    textFile = fopen(argv[1], "r");
    lineToken = malloc(sizeof(1));
    string = malloc(sizeof(MAX_CHAR));

    while(fgets(string, MAX_CHAR, textFile) != NULL) { /* Get first line of text */
        lineToken[0] = strtok(string, " "); /* Put first element in lineToken[0] */
        for(i = 1; i; i++) {
            /* Realloc because total number of elements is unknown */
            lineToken = realloc(lineToken, i + 1);

            /* Put new strtok'd string into lineToken[i] */
            lineToken[i] = strtok(NULL, " "); 
        }

        for(i = 0; i; i++) {
            move(i, 0);
            printw("%s", lineToken[i]);
            refresh();
        }
    }
    free(lineToken);
    free(string);
} /* End of function */
但我一直在犯这样的错误:

*** glibc detected *** ./bin/a3RunMe: realloc(): invalid next size: 0x01f2a270 ***
Aborted

这是最可能的问题:

lineToken = malloc(sizeof(1));
这里分配整数文本的大小,但
lineToken
至少需要
sizeof(*lineToken)
(或
sizeof(char*)
)字节。整数的大小和指针的大小可能不同,尤其是在64位平台上(其中
int
为四个字节,指针为八个字节)

所以当你这么做的时候

lineToken[0] = strtok(string, " ")
写入超出分配的内容(缓冲区溢出)并覆盖分配器放在那里的数据

realloc
调用也有问题,它将分配
i+1
字节。因此,即使您在32位平台上(其中
int
的大小恰好与指针的大小相同),您也会在循环的第一次迭代中将指针从四个字节重新分配到两个字节


您还存在其他问题,如以下循环:

for(i = 1; i; i++)

请记住,在C中,所有非零值都是真的,在该循环中,
i
何时会为零?

这是最可能的问题:

lineToken = malloc(sizeof(1));
这里分配整数文本的大小,但
lineToken
至少需要
sizeof(*lineToken)
(或
sizeof(char*)
)字节。整数的大小和指针的大小可能不同,尤其是在64位平台上(其中
int
为四个字节,指针为八个字节)

所以当你这么做的时候

lineToken[0] = strtok(string, " ")
写入超出分配的内容(缓冲区溢出)并覆盖分配器放在那里的数据

realloc
调用也有问题,它将分配
i+1
字节。因此,即使您在32位平台上(其中
int
的大小恰好与指针的大小相同),您也会在循环的第一次迭代中将指针从四个字节重新分配到两个字节


您还存在其他问题,如以下循环:

for(i = 1; i; i++)

请记住,在C中,所有非零值都是真的,并且在该循环中,
i
何时会为零?

for
循环是无限的

for(i = 1; i; i++)
{
        lineToken = realloc(lineToken, i + 1); /* Realloc because total number of elements is unknown */
        lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */
}
对于
i!=0


您可能在循环中不断递增和分配,因此会出现错误。

for
循环是无限的

for(i = 1; i; i++)
{
        lineToken = realloc(lineToken, i + 1); /* Realloc because total number of elements is unknown */
        lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */
}
对于
i!=0


您可能在循环中不断递增和分配,因此出现了错误。

您的意思是
printf
而不是
printw
。我很抱歉。我正在使用ncurses库,所以将文本打印到屏幕上需要printw。当然你是指
printf
而不是
printw
。我很抱歉。我使用的是ncurses库,所以在屏幕上打印文本需要printw。好的,所以我修复了循环的迭代。我认为“string!=NULL”的条件应该足够了。现在,通过realloc调用。。。你建议我在那里放什么?我想你明白我的意思了吧?@user2359287记得你分配的是成倍的
sizeof(char*)
字节,所以
sizeof(char*)*(I+1)
。这很有意义。我添加了你建议的内容,效果很好!谢谢大家的帮助。好的,我修复了循环的迭代。我认为“string!=NULL”的条件应该足够了。现在,通过realloc调用。。。你建议我在那里放什么?我想你明白我的意思了吧?@user2359287记得你分配的是成倍的
sizeof(char*)
字节,所以
sizeof(char*)*(I+1)
。这很有意义。我添加了你建议的内容,效果很好!谢谢大家的帮助。