我目前正在学习C,并且遇到了我真的不理解的链表问题。
我创建了以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list
{
int age;
char name[256];
struct list *next;
};
void displayList ( struct list *node );
int main( void )
{
struct list *node = malloc ( sizeof ( struct list ) );
node->age = 10;
strcpy( node->name, "Kiara" );
node->next = malloc ( sizeof ( struct list ) );
node->next->next = NULL;
displayList( node );
free( node->next );
free( node );
}
void displayList ( struct list *node )
{
int i = 0;
struct list *current = node;
while ( current != NULL )
{
printf( "%d) - Age = %d\n%d) - Name = %s\n",i , node->age, i, node->name );
i++;
current = current->next;
}
}
当displayList()
打电话时,我期望得到这样的东西:
0) - Age = 10
0) - Name = Kiara
1) - Age = GARBAGE
1) - Name = GARBAGE
但是我得到了:
0) - Age = 10
0) - Name = Kiara
1) - Age = 10
1) - Name = Kiara
我在做什么/在这里理解不对?
答案 0 :(得分:9)
您正在循环中打印节点值,但应打印当前值。节点指针不变。
node->age, node->name
应该是:
current->age, current->name
答案 1 :(得分:3)
在您的循环中:
while ( current != NULL )
{
printf( "Age = %d\nName = %s\n", node->age, node->name );
current = current->next;
}
您始终打印node->name
,而应该打印current->name
:
printf( "Age = %d\nName = %s\n", current->age, current->name );
指针node
永不改变。
答案 2 :(得分:2)
1) - Age = GARBAGE
1) - Name = GARBAGE
您期望可以打印垃圾,但是不要这样。访问未初始化的变量实际上是未定义的行为。在大多数实现中,它们会打印垃圾,但实际上可能会发生任何事情(例如,运行时崩溃)。即使实现在尝试访问未初始化的变量时不会崩溃,您在打印垃圾时也可能会遇到问题。
printf("%s", str);
这需要一个以null结尾的字符串。如果您的随机垃圾数据不包含\0
,则会再次导致运行时崩溃。
您没有循环打印current
的数据(其他答案已经指出了该数据)。
printf( "%d) - Age = %d\n%d) - Name = %s\n",i , current->age, i, current->name );