C語言建立鏈表錯誤之通過指標參數申請動態記憶體執行個體分析_C 語言

來源:互聯網
上載者:User

本文執行個體講述了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程式資料結構與演算法設計的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.