原程序如下图: Node* init_list() { int i; int a[10]={4,5,6,12,4,6,7,5,8,17}; Node *head,*p; head=(Node *)malloc(sizeof(Node)); p=head; for(i=0;i<9;i++) { if(p==NULL) return NULL; p->data=a[i]; p=p->next; p->next=(Node *)malloc(sizeof(Node)); } p=NULL; return head; } void print_list(Node *head) { while(head) { printf("head data = %d\n",head->data); head=head->next; } } int main() { Node *head; Node *init; head=init_list(); init = head; print_list(init); return 0; } 之前测试,打印链表就输出第一个值4; 一直找不到原因; 最后发现是标记红色两行的原因: 正确的代码应该是这两行颠倒一下; p->next=(Node *)malloc(sizeof(Node)); p=p->next; 因为malloc函数是分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。 所以每次malloc都返回一个新的地址; 如果按照原程序的话,p指针指向的就不是最新的p->next了;