c - 我无法用c语言读取另一个结构

标签 c file binary structure

我正在尝试读取一个包含另一个结构的结构,然后将其写入二进制文件。但是,当我检查结构是否从键盘上正确读取时,结构 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/

相关文章:

c - 从十进制字符串到二进制镜像十进制的最短方法?

c - c 中的任何 api 都可以更改 linux 中的路由表

c - 从文件创建链接列表时程序总是崩溃

objective-c - 目标 - C - << 在枚举中的使用

python - Pickle 和 Unpickle dict w/list 作为值

iphone - 在 iPhone 模拟器中从硬盘读取文件

c# - c#中的十六进制数运算

c++ - 从文件中逐字节读取 C++

C:f>0 与 Perl:$f>0?

c - 从 c 程序测量页面错误