關於指標初始化為NULL的一些問題

2022-09-16 18:01:33
  1. 關於指標初始化問題,先看以下程式碼;

    #include <stdio.h>

    typedef struct
    {
      char data[128];
      int top;

    } Stack;

    void push(Stack *stack, char c)
    {
      stack->data[++stack->top] = c;
    }
    char pop(Stack *stack)
    {
      return stack->data[stack->top--];
    }
    int main()
    {
      Stack *stack = NULL;
      Stack s = {"", 0};
      stack = &s;
      push(stack, 'a');
      push(stack, 'b');
      push(stack, 'c');
      push(stack, 'd');
      push(stack, 'e');

      while (stack->top > -1)
          printf("%c", pop(stack));
    }

    這是一個普通的棧程式,在main函數中,首先對stack指標初始化為NULL;

    但是如果這就是所謂的初始化,看下圖

     

     

就會出現以上的錯誤,Segmentation fault,這是一個很經典的錯誤,這是關於這個異常的一篇文章(19條訊息) Segmentation fault(Core Dump)問題_有石為玉的部落格-CSDN部落格

這是因為我初始化指標,但是後續沒有對這個指標再次進行操作。對於指標初始化,可以參考這個文章指標變數的初始化,C語言指標變數初始化詳解 (biancheng.net)

這裡提到了:但是在作業系統中,該記憶體單元是不可用的。凡是試圖往該記憶體單元中寫入資料的操作都會被視為非法操作,從而導致程式錯誤。同樣,這種錯誤在編譯的時候也不會報錯,只有在執行的時候才會出錯。這種錯誤也屬於「段錯誤」。

然而雖然這麼寫是錯誤的,但是將一個指標變數初始化為指向 NULL,這在實際程式設計中是經常使用的。就跟前面講普通變數在定義時給它初始化為 0 一樣,指標變數如果在定義時不知道指向哪裡就將其初始化為指向 NULL。只是此時要注意的是,在該指標變數指向有效地址之前不要往該地址中寫入資料。也就是說,該指標變數還要二次賦值。而我的程式下的

Stack s = {"", 0};stack = &s;正是對該指標變數的二次賦值。

(因為沒搞懂這個,還被我舍友臭罵了一頓)。ok以上就是關於指標初始化為NULL,我的看法。