我一直在努力与特定的家庭作业功能,包括使用列表并动态地将内存分配到所述列表的第二维并填充其元素,使用以下结构:
13 typedef struct BookIds{
14 int id;
15 struct BookIds* next;
16 }bookIds;
18 typedef struct Student{
//Unimportant struct elements
23 bookIds* wishlist;
24 struct Student* next;
25 }student;
然后调用
void addWishlist(student* head, char* wishListfile) {
//cannot modify parameters or return type
191 FILE* f = fopen(wishListfile, "r");
192 student* current = head;
193 int i;
194 int* wish = malloc(sizeof(int) * 4);
195 while (current != NULL) {
196 current->wishlist = malloc(sizeof(bookIds));
197 fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3));
198 for (i = 0; i < 4; i++) {
199 current->wishlist->id = *(wish+i);
200 current->wishlist->next = malloc(sizeof(bookIds))
201 current->wishlist = current->wishlist->next;
202 }
203 current = current->next;
204 }
205 free(wish);
206 fclose(f);
207 }
问题是在函数调用之后,第二个数组列表丢失了它的内存(所有元素都是NULL),因为它是val的传递。通常我会选择返回一个列表或使用双指针作为参数,但这些不是这个赋值的选项。任何帮助/编程建议将不胜感激。
答案 0 :(得分:1)
问题是在函数调用之后,第二个数组列表丢失了它的内存(所有元素都是NULL),因为它是val的传递。
这不是问题,因为传递给函数的参数都没有在函数内部发生变化。
相反,我认为你的问题在这里:
198 for (i = 0; i < 4; i++) {
199 current->wishlist->id = *(wish+i);
200 current->wishlist->next = malloc(sizeof(bookIds))
201 current->wishlist = current->wishlist->next;
202 }
您似乎希望wishlist
包含4个元素,但在第201行中,您将current->wishlist
更改为指向链中的最后一个元素。所以你最终只得到一个未初始化的元素。
您可以通过简单绘制元素和指针来看到这一点:
如您所见,您在执行第201行后丢失了第一个元素。
当函数完成时,它看起来像这样:
你丢失了除最后一个之外的所有元素(btw未初始化)。
因此,您需要重写上面的行,这样就不会在第201行更改current->wishlist
。还要记住将最后一个next
指针设置为NULL。
也许您可以用以下内容替换第196-202行:
fscanf(f, "%d %d %d %d", (wish), (wish+1), (wish+2), (wish+3));
bookIds* p;
for (i = 0; i < 4; i++) {
if (i == 0) {
current->wishlist = malloc(sizeof(bookIds));
p = current->wishlist;
} else {
p->next = malloc(sizeof(bookIds));
p = p->next;
}
p->id = = *(wish+i);
p->next = NULL;
}
顺便说一句:您还应该添加malloc
和fscanf
成功的支票。