Я не могу прочитать структуру на другом языке C - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь прочитать структуру, которая содержит другую структуру, а затем записать ее в двоичном файле.Однако, когда я проверяю, была ли структура хорошо прочитана с клавиатуры, структура 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);

    }



}

1 Ответ

0 голосов
/ 23 января 2019

Обратите внимание, что 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))).

...