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法式數據構造與算法設計的進修有所贊助。