我正在尝试读取一个包含另一个结构的结构,然后将其写入二进制文件。但是,当我检查结构是否从键盘上正确读取时,结构 FIRMA 未正确读取。 'nrang' 的值始终为 0,'localitate' 字符串非常奇怪。 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char localitate[10];
int nrang;
} FIRMA;
typedef struct
{
char nume[20];
int varsta;
FIRMA firma;
} ANG;
int main()
{
FILE* f;
ANG* a;
int n,i;
if ((f=fopen("fis.txt","wb"))==NULL) exit(1);
printf("number?\n");
scanf("%d",&n);
a=(ANG*)malloc(n*sizeof(ANG*));
printf ("Dati valorile");
for (i=0; i<n; i++)
{
scanf("%s%d",&a[i].nume,&a[i].varsta);
scanf("%s",&a[i].firma.localitate);
scanf("%d",&a[i].firma.nrang);
fwrite(&a[i],sizeof(a[0]),1,f);
printf("%s\n%d\n%s\n%d\n",a[i].nume,a[i].varsta,a[i].firma.localitate,a[i].firma.nrang);
}
}
最佳答案
请注意 sizeof(ANG*)
与 sizeof(ANG)
不同(前者是指针的大小——可能是 8——而后者是结构的大小——可能是 40),这意味着您只分配了大约 1/5 的内存。因此,后面的代码最终会写入和读取已分配内容的末尾,这具有未定义的行为。
在分配指针 ptr
时养成使用 sizeof(*ptr)
的习惯,这将始终为您提供它指向的内容的大小,因此您不必考虑“这里我需要 sizeof(ANG)
还是 sizeof(ANG*)
?”。这在分配多维数组时特别有用(例如 int ***three_d_array = malloc(n * sizeof(*three_d_array))
)。
关于c - 我无法用c语言读取另一个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318704/