【问题标题】:How can I make a dynamically allocated array of structures?如何制作动态分配的结构数组?
【发布时间】:2019-10-28 01:17:28
【问题描述】:

对于这个问题,我得到了一个电影列表、它们的类型等。然后我必须读取该文件并将其放入一个结构数组中。我正在尝试动态分配数组,但我不知道如何正确执行此操作。

我有它

list1 = (list_t *)malloc(n * sizeof(int));

不知道这有什么问题,但我确定它就在这里。

【问题讨论】:

    标签: c struct malloc


    【解决方案1】:

    movies = (list_t *)malloc(n * sizeof(int)); 为每条记录分配一个整数,而不是一条记录。这意味着您没有所需的空间,因此您正在将数据读入您不拥有的内存中。那是未定义的行为。你需要movies = malloc(n * sizeof(list_t));

    您还可以在关闭文件后使用FILE* pointer。那不行……

    额外建议:为什么在第二个循环中使用m?只需直接使用i。不要将名称 pointer 用于 FILE*fp 是常用的 inputfile 可以说更好。

    【讨论】:

    • 感谢您的建议。你是对的,使用 i 会更有意义,不知道为什么我使用 m。我对编码还很陌生,必须为一个班级做这个,所以不太确定什么是名字的好坏,所以我很感激这方面的帮助。那么我的下一个问题是,如果指针打开文件后,我为什么不能再次使用指针??
    • fclose() 文件,所以现在它不再打开了。您可以再次fopen 或去掉fclose 并使用fseek 来回退文件。
    【解决方案2】:

    语句sizeof(int) 给出了整数的字节大小。所以,在声明中:

    movies = (list_t *)malloc(n * sizeof(int));
    

    您实际上是在为 n 整数分配内存空间,如果您的 list_t 的大小与整数相同,则可以,但事实并非如此。您需要像这样为nlist_ts 分配空间:

    movies = malloc(n * sizeof(list_t));
    

    此外,您使用fclose(pointer) 关闭文件指针,但随后在下一个for 循环中使用它:fscanf(pointer, ...),这是一个错误。您可以再次对其执行fopen 或删除fclose 并使用fseek 返回文件的开头。最后一点,你不需要在这个循环中使用m,你可以像这样使用i

    ..., movies[i].title, movies[i].genre, &movies[i].avscore, movies[i].rating, &movies[i].rentals, &movies[i].year);
    

    然后将m++ 语句连同m 变量一起移除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 2020-03-06
      • 2021-10-30
      • 2017-03-30
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多