我试图通过realloc
动态调整数组大小。使用malloc
在我的函数外部初始化此数组。
这是我的功能:
size_t verarbeite_anlagendatei(ANLAGE *anlage_arr) {
FILE *fp;
ANLAGE anlage;
fp = fopen("anlagen.dat", "r");
if(fp == NULL) {
printf("Anlagedatei existiert nicht. Bitte mit Menuepunkt (0) weiter machen.\n");
return 0;
}
int index = 0;
size_t size = 1;
while(fscanf(fp, "%d %s %s %f %d %d",
&anlage.InventarNr,
anlage.Anlagenbez,
anlage.Standort,
&anlage.Basiswert,
&anlage.Nutzdauer,
&anlage.AnschJahr) != EOF) {
if(index > 0) {
size++;
realloc(anlage_arr, size * sizeof(ANLAGE));
}
anlage_arr[index] = anlage;
index++;
}
return size;
}
我知道我必须初始化一个指向ANLAGE
类型的新指针,并在调用NULL
后检查它是否为realloc
,但由于此函数总是崩溃程序,我在这种情况下,我已经跳过了它。
答案 0 :(得分:2)
除了上面评论中提到的许多细节之外,您还需要注意realloc
返回指向它已分配的内存块的指针,它可能与指针不在同一位置它已通过。换句话说,在调用realloc
之后,指针所指向的原始内存(在这种情况下,anlage_arr
)可能已被释放,并且realloc
返回的指针必须用于访问重新分配的内存。
我建议您可能需要按如下方式重写您的功能:
size_t verarbeite_anlagendatei(ANLAGE **p_anlage_arr) {
FILE *fp;
ANLAGE anlage;
fp = fopen("anlagen.dat", "r");
if(fp == NULL) {
printf("Anlagedatei existiert nicht. Bitte mit Menuepunkt (0) weiter machen.\n");
return 0;
}
int index = 0;
size_t size = 1;
while(fscanf(fp, "%d %s %s %f %d %d",
&anlage.InventarNr,
anlage.Anlagenbez,
anlage.Standort,
&anlage.Basiswert,
&anlage.Nutzdauer,
&anlage.AnschJahr) != EOF) {
if(index > 0) {
size++;
*p_anlage_arr = realloc(*p_anlage_arr, size * sizeof(ANLAGE));
}
(*p_anlage_arr)[index] = anlage;
index++;
}
return size;
}
对此函数的调用看起来像
ANLAGE *anlage_arr;
size_t sz;
anlage_arr = malloc(sizeof(ANLAGE));
sz = verarbeite_anlagendatei(&anlage_arr);
祝你好运。