我正在撰寫一個雙重鏈接測驗作為練習。在添加節點時,我可以在添加節點的函式中測驗新節點指向下一個元素的指標是否為 NULL,但我無法在呼叫添加節點的函式的主函式中測驗 NULL。
我希望下面的代碼片段能列印出來:“MAIN:NULL POINTER CHECK WORKS” 但即使之前的“add”測驗也不起作用。這是因為當新節點的下一項指標在 printf 中計算為 0 時,它在 if 陳述句中不會計算為 false。我錯過了什么?
#include <stdio.h>
#include <stdlib.h>
struct elem{
int num;
struct elem *nextElem;
struct elem *previousElem;
};
int add(struct elem *point, int val){
struct elem new = {val, NULL, NULL};
printf("New next pointer - %d\n", (int) new.nextElem);
point->nextElem = &new;
if (!point->nextElem->nextElem){
printf("ADD: Null pointer check works\n");
}
printf("Point next pointer - %d\n", (int) point->nextElem);
return 0;
}
int main(){
struct elem start = {1, NULL, NULL};
add(&start, 2);
if (start.nextElem){
printf("START NEXT ELEM POINTER VALUE: %d\n", (int) start.nextElem->nextElem);
if ( !start.nextElem->nextElem ) {
printf("MAIN:NULL POINTER CHECK WORKS\n");
}
}
}
輸出:
新的下一個指標 - 0
添加:空指標檢查有效
指向下一個指標 - -393574968
開始下一個元素指標值:0
uj5u.com熱心網友回復:
在您宣告具有自動存盤持續時間add的區域變數的函式中:new
int add(struct elem *point, int val){
struct elem new = {val, NULL, NULL};
printf("New next pointer - %d\n", (int) new.nextElem);
point->nextElem = &new;
//...
退出函式后,該變數將不再存在(其生命周期將結束)。所以退出函式后指向變數的指標有一個無效值。取消參考指標會呼叫未定義的行為。
您需要動態分配串列的節點。
請注意,要輸出指標的值,您應該使用轉換說明符&p。例如
printf("New next pointer - %p\n", (void *) new.nextElem);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490433.html
