C语言创建链表错误之通过指针参数申请动态内存实例分析
本文实例讲述了C语言创建链表中经典错误的通过指针参数申请动态内存,分享给大家供大家参考之用。具体实例如下:
#include<stdio.h> #include<stdlib.h>//用malloc要包含这个头文件 typedefstructnode { intdata; structnode*next;//这个地方注意结构体变量的定义规则 }Node; voidcreateLinklist(Node*pHder,intlength) { inti=0; Node*pTail=NULL; Node*pTemp=NULL; printf("create\n"); for(i=0;i<length;i++) { pTemp=(Node*)malloc(sizeof(Node));//本来以为错误在这个地方,原来是理解错了 /*这句话是给pTemp重新赋值,所以在for里边和for外边定义pTemp是无所谓的*/ pTemp->data=i*10; pTemp->next=NULL; if(NULL==pHder) { pHder=pTemp;//错误的关键 } else { pTail->next=pTemp; } pTail=pTemp; } } voidprint(Node*pHeader) { Node*p=pHeader; printf("print\n"); while(p) { printf("%4d",p->data); p=p->next; } putchar('\n'); } intmain(void) { Node*pHeader=NULL;//C和C++中判断指针为空都是用NULL宏(全大写) createLinklist(pHeader,10);//这是个很典型的错误,错误的原因就在这 /*pHeader是一个Node*型的变量*/ /*既然是个变量,那么在传递参数的时候,编译器必然会给这个变量制作一个临时副本*/ /*假设这个临时副本是_pHeader_*/ /*在刚刚传递进去的时候,pHeader和_pHeader_是相同的*/ /*但是在动态申请内存之后,_pHeader_指向了新的地址[[注意]]它不是在修改_pHeader_指向的内容的值,而是修改_pHeader_所指向的地址*/ /*而此时pHeader仍然指向原来的地址*/ /*所以,其实在createLinklist的整个运行过程中pHeader都没有受到影响*/ print(pHeader); return0; }
上述实例以注释的形式对易错点进行了详细的分析,相信不难理解。希望本文所述对大家C程序数据结构与算法设计的学习有所帮助。