C說話創立鏈表毛病之經由過程指針參數請求靜態內存實例剖析。本站提示廣大學習愛好者:(C說話創立鏈表毛病之經由過程指針參數請求靜態內存實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話創立鏈表毛病之經由過程指針參數請求靜態內存實例剖析正文
本文實例講述了C說話創立鏈表中經典毛病的經由過程指針參數請求靜態內存,分享給年夜家供年夜家參考之用。詳細實例以下:
#include <stdio.h> #include <stdlib.h>// 用malloc要包括這個頭文件 typedef struct node { int data; struct node* next;// 這個處所留意構造體變量的界說規矩 } Node; void createLinklist(Node* pHder, int length) { int i = 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; } } void print(Node* pHeader) { Node* p = pHeader; printf("print\n "); while(p) { printf("%4d ", p->data); p = p->next; } putchar('\n'); } int main(void) { Node* pHeader = NULL;// C和C++中斷定指針為空都是用NULL宏(全年夜寫) createLinklist(pHeader, 10);//這是個很典范的毛病,毛病的緣由就在這 /* pHeader是一個Node*型的變量 */ /* 既然是個變量,那末在傳遞參數的時刻,編譯器必定會給這個變量制造一個暫時正本 */ /* 假定這個暫時正本是_pHeader_ */ /* 在方才傳遞出來的時刻,pHeader和_pHeader_是雷同的 */ /* 然則在靜態請求內存以後,_pHeader_指向了新的地址 [[留意]] 它不是在修正_pHeader_指向的內容的值,而是修正_pHeader_所指向的地址 */ /* 而此時pHeader依然指向本來的地址 */ /* 所以,其其實createLinklist的全部運轉進程中pHeader都沒有遭到影響 */ print(pHeader); return 0; }
上述實例以正文的情勢對易錯點停止了具體的剖析,信任不難懂得。願望本文所述對年夜家C法式數據構造與算法設計的進修有所贊助。