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

  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,我的看法。