我正在尝试读取包含另一个结构的结构,然后将其写入二进制文件。但是,当我检查结构是否从键盘读取良好时,结构 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你打算的记忆。结果,后面的代码会在分配的内容结束之后进行写入和读取,这具有未定义的行为。
帮助人们解决这个问题的一种做法是养成sizeof(*ptr)
在分配指针时使用的习惯ptr
,这将始终为您提供它指向的内容的大小,因此您不必考虑“我需要sizeof(ANG)
还是sizeof(ANG*)
在这里?” . 这在分配多维数组(例如int ***three_d_array = malloc(n * sizeof(*three_d_array))
)时特别有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句