2d链接列表内存未携带

时间:2017-03-19 06:05:17

标签: c memory linked-list

我一直在努力与特定的家庭作业功能,包括使用列表并动态地将内存分配到所述列表的第二维并填充其元素,使用以下结构:

    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的传递。通常我会选择返回一个列表或使用双指针作为参数,但这些不是这个赋值的选项。任何帮助/编程建议将不胜感激。

1 个答案:

答案 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更改为指向链中的最后一个元素。所以你最终只得到一个未初始化的元素。

您可以通过简单绘制元素和指针来看到这一点:

enter image description here

如您所见,您在执行第201行后丢失了第一个元素。

当函数完成时,它看起来像这样:

enter image description here

你丢失了除最后一个之外的所有元素(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;
      }

顺便说一句:您还应该添加mallocfscanf成功的支票。