【问题标题】:Why does my output have garbage value, and how to fix it?为什么我的输出有垃圾值,以及如何修复它?
【发布时间】:2020-03-11 05:59:19
【问题描述】:
#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);
}

这是output

ø -605554032 entropy // 但下一行输出是正确的

【问题讨论】:

  • int size; struct info band[size]; 第二条语句导致未定义的行为,因为此时尚未初始化 size 变量。将其移动到scanf 之后。
  • 其他注意事项:始终检查函数调用的返回值。在这种情况下,检查scanffopen 结果非常重要。
  • @kaylum 请将其更改为答案。

标签: c struct file-handling garbage


【解决方案1】:

您的带区数组的内存分配存在问题。当您编写“struct info band [size]”时,您实际上是在告诉您的计算机:“请为我创建大小结构并在堆栈上为它们找到一个位置”。但是,由于两个原因,这不能在这里发生:

  1. 正如我上面的评论所说,当该行发生时,变量大小未初始化。

  2. 即使你有类似size=3; struct info band[size] 的代码,事情也不会起作用,因为程序必须知道它应该为堆栈上的带数组创建多少空间在编译时在运行时 设置 size 变量时 - 使用 malloc 来解决这个问题:scanf(%d, &amp;size); struct info * band = (struct info*)malloc(sizeof(struct info) * size); 这将为堆栈上的数组创建 4 个字节(即:指针大小),同时动态分配堆上实际数组的相关内存。

在main函数最后别忘了加上free(band);

祝你好运!

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2021-12-20
    • 2021-02-20
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多