我尝试使用 realloc 函数分配并得到错误

i try to allocated with realloc function and get error

typedef struct{
   char** strings_cmd;
   int size_cmd;
}parseInfo;

.....

parseInfo* parse(char* cmd){
    char* temp = strdup(cmd);
    char* temp_split = strtok(temp," ");
    int i = 0;
    char** strings = (char**)malloc(sizeof(char*));
    if(strings == NULL){
        printf("no memory allocated strings parse()\n");
        exit(1);
    }
    while(temp_split != NULL){
        strings[i++] = strdup(temp_split);
        strings = realloc(strings,i * sizeof(char*));
        if(strings == NULL){
            printf("no memory allocated strings (while) parse()\n");
            exit(1);
        }   
        temp_split = strtok(NULL," ");
    }
    strings[i] = NULL;
    parseInfo* info = (parseInfo*)malloc(sizeof(parseInfo));
    if(info == NULL){
        printf("no memory allocated info parse()\n");
        exit(1);
    }
    info->strings_cmd = strings;
    info->size_cmd = i;
    return info;
}

大家好,我收到错误消息:

realloc(): invalid next size.

我尝试做的是输入一个字符串并将其拆分成单词 例如我输入 =“Hello World”。 并拆分它 = "Hello" , "World"

但是当我传递 4 个单词时出现此错误...

这条线有问题:

        strings = realloc(strings,i * sizeof(char*));

此行正在将数组大小调整为 i 个元素。 然后,在下一次迭代中,一些值被存储到数组的第 i 个元素(由 strings 指向)。该数组只有 i 个元素(0i-1),所以这是 out-of-range 访问。

分配足够的元素来修复:

        strings = realloc(strings,(i + 1) * sizeof(char*));

另请注意,malloc() 家族的铸造结果是 considered as a bad practice

对于初学者来说,该函数存在内存泄漏,因为在函数的开头分配了内存

parseInfo* parse(char* cmd){
    char* temp = strdup(cmd);
    //...

未释放。

在这个 while 循环中

while(temp_split != NULL){
    strings[i++] = strdup(temp_split);
    strings = realloc(strings,i * sizeof(char*));
    if(strings == NULL){
        printf("no memory allocated strings (while) parse()\n");
        exit(1);
    }   
    temp_split = strtok(NULL," ");

你需要写

strings = realloc(strings, ( i + 1 ) * sizeof(char*));

为该语句中使用的终止空指针保留一个元素

strings[i] = NULL;

并且您需要在函数开头释放动态分配的内存,例如

free( temp );

}

您正在分配一个指针数组,其所需元素少了一个。