關於指標初始化問題,先看以下程式碼;
#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,這是一個很經典的錯誤,這是關於這個異常的一篇文章
這是因為我初始化指標,但是後續沒有對這個指標再次進行操作。對於指標初始化,可以參考這個文章
這裡提到了:但是在作業系統中,該記憶體單元是不可用的。凡是試圖往該記憶體單元中寫入資料的操作都會被視為非法操作,從而導致程式錯誤。同樣,這種錯誤在編譯的時候也不會報錯,只有在執行的時候才會出錯。這種錯誤也屬於「段錯誤」。
然而雖然這麼寫是錯誤的,但是將一個指標變數初始化為指向 NULL,這在實際程式設計中是經常使用的。就跟前面講普通變數在定義時給它初始化為 0 一樣,指標變數如果在定義時不知道指向哪裡就將其初始化為指向 NULL。只是此時要注意的是,在該指標變數指向有效地址之前不要往該地址中寫入資料。也就是說,該指標變數還要二次賦值。而我的程式下的
Stack s = {"", 0};stack = &s;正是對該指標變數的二次賦值。
(因為沒搞懂這個,還被我舍友臭罵了一頓)。ok以上就是關於指標初始化為NULL,我的看法。