我正在尝试读取包含以下内容的文件。
59878, Moby Dick
442419, The Peach
535, Moby Dick
12, History of War
我有一个包含整数类型的链表,另一个包含char和链表的指针。这是后一个链表中的一个节点:
typedef struct Node {
struct Node* prev;
char *title;
ListRef library; //Pointer to a different linked list
struct Node* next;
} Node;
typedef struct Node* NodeRef;
NodeRef newNode(char *bookTitle, List LL) {
NodeRef node = (Node*)malloc(sizeof(Node));
node->next = node->prev = NULL;
node->title = (char*)calloc(60, sizeof(char));
node->library = newList();
node->library = LL;
node->title = bookTitle;
return(node);
}
答案 0 :(得分:0)
您应该使用
存储title
node->title = strdup(bookTitle);
删除calloc
行,因为strdup
将为您执行内存分配。
当前编写代码时,为字符串分配内存,然后分配行
node->title = bookTitle;
将指针更改为指向bookTitle
指向的缓冲区。据推测,您正在重用bookTitle
缓冲区,因此在程序结束时,所有标题都指向同一个缓冲区,该缓冲区包含从文件中读取的最后一个标题。
答案 1 :(得分:0)
NodeRef newNode(char *bookTitle, List LL) {
NodeRef node = (Node*)malloc(sizeof(Node));
仅供参考:上述行不需要转换malloc()返回的值。相反,该行可以是:NodeRef node = malloc(sizeof(Node));
node->next = node->prev = NULL;
node->title = (char*)calloc(60, sizeof(char));
现在node-> title指向一个60字节的已分配块。
node->library = newList();
node->library = LL;
node->title = bookTitle;
因此,booktitle是指向包含字符串的内存的指针。上面的语句导致node-> title指向bookTitle指向的同一个东西。对于之前指向的60个字符的已分配块太糟糕了;记忆现在无法恢复孤儿。 (这不是我想要的,我确定)。
上述行应更改为以下内容:
// Assumption: bookTitle contains a properly terminated C string.
node->title = strdup(bookTitle);
if(NULL == node->title)
{
fprintf(stderr, "strdup() failed!\n");
/* and handle the error, even though you may never actually see it... */
...
}
return(node);
}
在创建新节点时,它们都指向同一个项目,该地址包含在' bookTitle'中。因此,当打印出列表时,那就是(危险地)你得到的东西。所有节点都指出了上一本书中添加的书名。