Почему мой вывод имеет значение мусора, и как это исправить? - PullRequest
0 голосов
/ 11 марта 2020
#include<stdio.h>

struct info {
    char album[30];
    int released;
    char group[30];
};

int main() {
    FILE * fpt; 
    int size;
    struct info band[size];
    int i;

    printf("How many groups would you like to input: ");
    scanf("%d",&size); 

    for (i=0; i<size; i++) {

        printf ("Input what group: ");
        scanf(" %s", band[i].group);    

        printf("Input released date: ");
        scanf(" %d", &band[i].released);

        printf("Input what album: ");
        scanf(" %s", band[i].album);

    }

    fpt = fopen("records.dat", "w");
    // printf("Group\t\tReleased\t\tAlbum\n");

    for (i=0; i<size; i++) {
        fprintf(fpt,"%s\t\t%d\t\t%s\n", band[i].group, band[i].released, 
        band[i].album);
    }

    printf("File created.\n");
    fclose(fpt);
}

это выход :

ø -605554032 энтропия // но выходы следующей строки правильные

1 Ответ

1 голос
/ 11 марта 2020

У вас есть проблема с выделением памяти для вашего массива диапазонов. Когда вы пишете «struct info band [size]», вы, по сути, говорите своему компьютеру: «пожалуйста, создайте для меня структуры размера и найдите место для них в стеке». Однако этого не может произойти по двум причинам:

  1. Как отмечалось выше в комментарии, размер переменной неинициализируется, когда эта строка имеет место.

  2. Даже если у вас был такой код: size=3; struct info band[size] что-то не сработало бы, так как программа должна знать, сколько места она должна создать для массива диапазонов в стеке во время компиляции , в то время как переменная размера устанавливается во время выполнения - используйте mallo c для решения этой проблемы: scanf(%d, &size); struct info * band = (struct info*)malloc(sizeof(struct info) * size); Это создаст всего 4 байта (т.е. размер указателя) для вашего массива в стеке при динамическом выделении соответствующая память для вашего фактического массива в куче.

В конце основной функции не забудьте добавить free(band);

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...