c - 我无法用 c 语言读取另一个结构
问题描述
我正在尝试读取包含另一个结构的结构,然后将其写入二进制文件。但是,当我检查结构是否从键盘很好地读取时,结构 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))
)时特别有用。
推荐阅读
- python - 有没有办法根据键盘输入改变玩家面对的方向?Pyglet, Cocos2d
- c++ - 如何使用 g++ 在 c++ 20 中使用模块?
- sql - 加入日期到日期范围 SQL
- firebase - 每次打开应用程序时都会触发 Flutter Dynamic Link
- javascript - 防止弹出窗口冒泡
- elasticsearch - Vue Sstorefront 上的 Elasticsearch 查询
- powershell - PowerShell:在几个文本文件的每 50 个单词后添加一个新的空行
- vert.x - 如何在使用 vert.x 读取 ContainerRequestContext 内的请求正文的 quarkus 框架中使用 @ServerRequestFilter
- pandas - pandas 根据另一列计算每个组的滚动总和
- flutter - 在 Navigator.pop 函数上刷新上一页