關於指針初始化為NULL的一些問題
-
關於指針初始化問題,先看以下代碼;
#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,我的看法。