我写了一个简单的程序,包括链表。当我尝试在创建它的函数中显示链接列表时,它可以正常工作;但是,当我返回主页并尝试显示它时,它无法正常工作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define LEN 20
struct Node {
char word[LEN];
int count;
Node * next;
};
Node* build_linked_list (char array[][LEN], int N);
Node* make_ordered_copy (Node * head);
void print_list(Node * head);
int main()
{
#define NUMBER 10
char array[NUMBER][LEN]; // array which the words will be recorded
int N=6;
for(int a=0; a<N; ++a) strcpy(array[a], "test");
print_list(build_linked_list(array, N));
getchar();
return 0;
}
Node* build_linked_list (char array[][LEN], int N)
{
Node ndArray[N];
Node *head, *newnode;
head = &ndArray[0];
strcpy(head->word, array[0]); // writing the first element to the head
head->count = 0;
head->next = NULL;
for(int a=1; a<N; ++a) // writing the elements in a linked list
{
newnode = &ndArray[a];
strcpy(newnode->word, array[a]);
newnode->count = 0;
newnode->next = head; // first location now becomes second location
head = newnode;
}
print_list(head);
printf("Previous values were shown in build_linked_list\n");
return head;
}
void print_list(Node* head)
{
Node* traverse;
traverse = head;
while(traverse) // while traverse is not NULL
{
printf("\"%s\" with the frequency of %d\n", traverse->word, traverse->count);
traverse = traverse->next;
}
return;
}
在从main调用的print_list函数中调试时,“traverse-&gt; word”首先显示正确的值,但它不会正确打印,然后它会更改为另一个值。
答案 0 :(得分:0)
ndArray
的元素仅在build_linked_list
范围内有效。一旦程序存在该函数,对这些元素的任何访问都会产生未定义的行为。您正在使用这些元素构建链接列表。相反,您需要为堆上链接列表的节点分配内存,或者需要将ndArray
变量移动到文件范围,以使其在main
方法的生命周期内存在。
答案 1 :(得分:0)
在build_linked_list
内你宣布
Node ndArray[N];
这是您在该功能中填充的节点。但是当执行结束时,build_linked_list
函数ndArray
的块被释放,因此返回的指针指向先前为ndArray
分配的内存,但现在不再被该数组占用。< / p>
链接列表的常规实现是使用堆和动态内存分配完成的。 在构建Node数组时,您应该写:
Node* ndArray = new ndArray[N];
但是在这一点上我强烈建议你阅读垃圾收集器以及如何正确管理动态内存,因为这是一个全新的主题,已经在StackOverflow上反复讨论过。
对于这个答案,我只是期待你在分配new
或new[]
时(对于malloc
和free
看到C参考)你也应该这样做分别使用delete
或delete[]
删除。在这种情况下,当您完成链接列表或ndArray
时,您应该写:
delete[] ndArray;
释放记忆。否则你会有内存泄漏。