Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Pointers_Struct_Dynamic Memory Allocation - Fatal编程技术网

结构数组上的realloc()给出的下一个大小无效

结构数组上的realloc()给出的下一个大小无效,c,arrays,pointers,struct,dynamic-memory-allocation,C,Arrays,Pointers,Struct,Dynamic Memory Allocation,我有这个功能。如您所见,所有操作都是在函数中完成的,我不会在main中进行分配,然后将任何内容传递给它(我只会在函数完成后返回指向数组的指针)。函数本身(数组大小固定)可以工作,但realloc失败 struct database *parse() { int i = 0; int n = 1; FILE *dbase = (fopen(PATH, "r")); if (dbase == NULL) { fprintf(stderr, ERRO

我有这个功能。如您所见,所有操作都是在函数中完成的,我不会在main中进行分配,然后将任何内容传递给它(我只会在函数完成后返回指向数组的指针)。函数本身(数组大小固定)可以工作,但realloc失败

struct database *parse() {

    int i = 0;
    int n = 1;

    FILE *dbase = (fopen(PATH, "r"));
    if (dbase == NULL) {
        fprintf(stderr, ERRORE_APERTURA);
        exit(EXIT_FAILURE);
    }

    struct database *database_array =  calloc(20*n, sizeof(struct database));
    if (database_array == NULL) {
        fprintf(stderr, "Impossibile allocare memoria\n");
        exit(EXIT_FAILURE);
    }

    while (feof(dbase) == 0) {
        fscanf(dbase, "%[^:]:%[^:]:\n", database_array[i].user, database_array[i].password);
        database_array[i].iswritten = 1;
        i++;
        if (i > 20*n) {
            n++;
            struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
            database_array = new_database_array;
        }
    }
    database_array[++i].iswritten = 0;

    fclose(dbase);  
    return database_array;
}
我试着阅读其他解释,但我不明白这里出了什么问题

我分配给calloc的数组最初是20。然后,当它被填满时,我希望它的大小加倍,所以我使用n,它是2,乘以20,所以是40

令人沮丧的是,我尝试用一个更简单的程序重新分配一个struct数组,并且做同样的事情没有任何问题:

#include <stdio.h>
#include <stdlib.h>

struct prova  {

    int a;

    int b[10];
};


int main() {

    struct prova* array_struct = calloc(10, sizeof(struct prova));

    array_struct[0].a = 2;

    struct prova* tmp = realloc(array_struct, sizeof(struct prova) * 20);

    free(array_struct);
    array_struct = tmp;

    array_struct[1].b[1] = 3;

    printf("a = %d", array_struct[0].a);
    printf("b = %d\n", array_struct[1].b[1]);

    return 0;   
}
#包括
#包括
结构prova{
INTA;
int b[10];
};
int main(){
struct prova*array_struct=calloc(10,sizeof(struct prova));
数组_结构[0].a=2;
struct prova*tmp=realloc(数组_struct,sizeof(struct prova)*20);
自由(数组结构);
数组结构=tmp;
数组结构[1].b[1]=3;
printf(“a=%d”,数组结构[0].a);
printf(“b=%d\n”,数组结构[1].b[1]);
返回0;
}
我没有看到什么?(请不要介意我没有检查realloc是否返回NULL,我稍后会添加)

你不能既重新分配又取消分配。您可以选择其中一种,但一旦选择了其中一种,以前的分配就不再存在,因此您不能选择另一种


在上面的第一行代码之后,不应再使用
数据库\u数组的值,因为它可能无效。

请正确格式化代码。如果
realloc
,请不要
释放原始指针。
struct prova*tmp=realloc(array\u struct,sizeof*tmp*20)@AlexD谢谢你的帮助suggestion@Paul您应该
在课程结束时释放
重新分配的块。但目前发生的是未定义的行为。(如果
realloc
返回与其参数相同的指针,则在使用之前将其释放)。甚至没有它也不行。@Paul完全有可能你有不止一个bug。但你必须先解决最严重的问题,那是灾难性的。(你在
main
中也有同样的错误。你甚至不能分析代码,因为它有那么严重的错误。)我测试了这个程序,它确实有效。我是说,如果有什么虫子我就看不见了。如果我不重新定位数组,它会工作得很好(但我必须为数组设置一个大小)。如果我试图重新分配它,它就会崩溃。所以我认为问题在于那次电话。
struct database *new_database_array = realloc(database_array, sizeof(struct database)*(20*n));
free(database_array);