【发布时间】:2019-10-28 01:17:28
【问题描述】:
对于这个问题,我得到了一个电影列表、它们的类型等。然后我必须读取该文件并将其放入一个结构数组中。我正在尝试动态分配数组,但我不知道如何正确执行此操作。
我有它
list1 = (list_t *)malloc(n * sizeof(int));
不知道这有什么问题,但我确定它就在这里。
【问题讨论】:
对于这个问题,我得到了一个电影列表、它们的类型等。然后我必须读取该文件并将其放入一个结构数组中。我正在尝试动态分配数组,但我不知道如何正确执行此操作。
我有它
list1 = (list_t *)malloc(n * sizeof(int));
不知道这有什么问题,但我确定它就在这里。
【问题讨论】:
movies = (list_t *)malloc(n * sizeof(int)); 为每条记录分配一个整数,而不是一条记录。这意味着您没有所需的空间,因此您正在将数据读入您不拥有的内存中。那是未定义的行为。你需要movies = malloc(n * sizeof(list_t));
您还可以在关闭文件后使用FILE* pointer。那不行……
额外建议:为什么在第二个循环中使用m?只需直接使用i。不要将名称 pointer 用于 FILE*。 fp 是常用的 inputfile 可以说更好。
【讨论】:
fclose() 文件,所以现在它不再打开了。您可以再次fopen 或去掉fclose 并使用fseek 来回退文件。
语句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 变量一起移除。
【讨论】: