首页 > 解决方案 > 我无法用 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);

    }



}

标签: cfilebinarystructure

解决方案


请注意,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)))时特别有用。


推荐阅读