我是一名 52 歲的化學工程師,在失業一段時間后決定轉行編程,并錯誤地選擇了 C 語言來學習。另外,英語不是我的母語,所以要友善。
我正在關注 Donald Alcock 的“Illustrating C”。我被這個問題困擾了一段時間。它是 p105 上一個名為 backslang 的程式。我不想發布整個代碼,包含自定義字串函式的頭檔案,它大約是 250 SLOC。
if (Qu == Instr(p, "qu", Equiv))
{
*(Qu 1)='$';
}
它應該做的是:如果它"qu"在字串中找到它會將段更改為"q$". 但是,char *Qu指標是在 main() 中宣告的,并且沒有初始化。gcc -Wall給出警告。我試圖用char *Qu = NULL代碼的行為來初始化它,并且錯誤沒有改變。我用 GDB 跟蹤它。Qu 的值始終為 0x0,當 Instr 函式在字串中找不到“qu”段時,它進入 if 塊(0 == 0;TRUE 或 1)并給出 SEGMENTATION FAULT。
經過大量研究,我了解了堆和堆疊之間的區別。我還了解到,在這種情況下,我必須使用 malloc() 在堆上保留記憶體。然而,在這一點上,這本書還沒有達到那種知識的地步,這段代碼應該可以作業。這是因為不同的C標準嗎?這本書寫于 1992 年。我嘗試了-ansi和-std=c89選項但沒有成功。我還是想不通。我錯過了什么?
uj5u.com熱心網友回復:
經過大量研究,我了解了堆和堆疊之間的區別。
毫無疑問,這將在您前進時證明是有用的知識。但可能不適用于這個特定問題。
我還了解到,在這種情況下,我必須使用 malloc() 在堆上保留記憶體。
我不確定您指的是哪種情況,但讓我為您省去很多麻煩:malloc()需要使用指標,但使用指標不一定需要malloc().
然而,在這一點上,這本書還沒有達到那種知識的地步,這段代碼應該可以作業。
我相信您在這里不需要動態記憶體分配。
考慮呈現的代碼:
if (Qu == Instr(p, "qu", Equiv)) { *(Qu 1)='$'; }
鑒于您所說的應該做的事情,以及所選擇的函式名稱和代碼形式,很明顯期望是
Instr()將在字串"qu"中查找子字串(我猜p這里給出),并且- 它將回傳指向該子字串中“q”的指標,如果未找到子字串,則回傳空指標。
- 該代碼旨在將回傳值分配給 variable
Qu,并測驗它是否為 null,如果它不為 null,則執行if陳述句的主體。
如果條件是,它會這樣做。這是因為ifQu = Instr(p, "qu", Equiv)
- (single)
=是賦值運算子, - 賦值運算式不僅分配給定的值,而且計算出所分配的值,并且
- 空指標在布爾背景關系中計算為假,而非空指標在此類背景關系中計算為真。
但是==是一個完全不同的運算子,一個與賦值相反的相等測驗,由于您似乎理解的原因,這里是錯誤的。
=不幸的是,在預期的條件運算式中使用它是一個相當常見的錯誤,==以至于某些編譯器實際上會警告您的代碼是否正確。犯相反的錯誤的情況要少得多,而且當這種邏輯是預期的那樣時,通常最好以不同的方式表達它。為了最大程度地清楚,我的建議是
Qu = Instr(p, "qu", Equiv);
if (Qu != NULL)
{
*(Qu 1) = '$';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519684.html
標籤:C指针堆
上一篇:類指標不命名型別
