我正在參加 CS 107 斯坦福課程,在講座中我們有這個簡單的堆疊結構
// stack.h
typedef struct {
int *elems;
int logicallen;
int alloclen;
} stack;
他通過做提到
stack *s;
它應該自動為結構保留記憶體空間。
但是,我遇到了分段錯誤,我必須這樣做手動分配記憶體:
stack *s = malloc(3*sizeof(int));
當我嘗試列印 s 時,它顯示 0
// this will cause segmentation fault
int main(){
stack *s;
printf("%d\n", s);
StackNew(s);
}
// this is fine
int main(){
stack *s = malloc(sizeof(stack));
printf("%d\n", s);
StackNew(s);
}
那么具體是stack *s;
做什么的呢?
uj5u.com熱心網友回復:
他通過做提到
stack *s;
它應該自動為結構保留記憶體空間。
不,它不應該那樣做。
那么具體是
stack *s;
做什么的呢?
然而,它所做的是宣告一個指向 a 的指標stack
。或者,換句話說,為指向的指標保留記憶體空間stack
。該指標未初始化,這意味著它指向某個隨機(*)記憶體位置。并且嘗試取消參考它會導致未定義的行為,這意味著任何事情都可能發生,包括您的代碼看似有效。這解釋了你的說法:
當我嘗試列印 s 時,它顯示 0
幾乎總是NULL
在使用它們之前初始化指標是一種很好的做法。這樣,您將避免孔類問題。
此外,不要忘記在不再需要分配的資源后釋放它們。
(*)通常,它指向上次使用它所指向的位置。
uj5u.com熱心網友回復:
這條線
stack *s;
是函式 main 中未初始化型別指標的宣告(定義)stack *
。所以指標的值是不確定的。stack
沒有創建該型別的物件。
要取消參考指標,它必須指向一個有效的物件。否則,取消參考未初始化的指標會呼叫未定義的行為。
請注意,要輸出指標,您必須使用轉換說明符p
而不是d
printf("%p\n", ( void * )s);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483995.html
上一篇:C中的陣列和指標,兩個問題
下一篇:將陣列的地址傳遞給C 中的函式