在c語言中,自動變數在堆疊中分配記憶體,當包含自動變數的函式或**塊退出時,它們所占用的記憶體便被**。被**的記憶體可能會被馬上覆蓋,也可能等到很久以後才會被覆蓋,這取決於堆疊中先前的自動變數位於何處,下乙個函式/**塊宣告的變數/寫入的內容等條件,所以如果有以下**:
char * func()
那麼這個函式會導致乙個難以察覺的bug。我想在呼叫函式中獲取buffer裡的內容,但有時候能夠「正常」獲取,有時候資料被破壞了……解決這個問題有幾種方案。
char * func()這是最簡單的解決方案,但實際應用中一般有更多的需求。
char globalarr[512];這適用於自己建立字串的情況,也很簡單易用。它的缺點在於任何人都有可能在任何時候有修改這個全域性陣列,而且函式的下一次呼叫也會覆蓋該陣列的內容。...char * func()
char * func()這就可以防止任何人修改這個陣列。只有擁有指向該陣列的指標的函式(通過引數傳遞給它)才能修改這個靜態陣列。但是,該函式的下一次呼叫將覆蓋這個陣列的內容,所以呼叫者必須在此之前使用或備份這個陣列的內容。和全域性陣列一樣,大型緩衝區如果閒置不用是非常浪費記憶體空間的。
char * func()這個方法具有靜態陣列的優點,而且在每次呼叫時都將建立乙個新的緩衝區,所以該函式每次呼叫的內容不會互相干擾,這使它適合多執行緒的**。它的缺點在於函式的使用者必須承擔記憶體管理的責任。如果記憶體正在使用卻被釋放,或者不再使用的記憶體還沒有被**,就會發生記憶體洩露,這會產生令人難以置信的bug。
為了提高安全性,呼叫者應該同時指定緩衝區的大小(就像標準庫中fgets()所要求的那樣)
void func(char * result, int size)這個方法相較於上乙個方法,優點在於程式設計師能在同乙個**塊中同時進行」malloc」和」free」操作,記憶體管理要輕鬆許多。...buffer = malloc(size);
func(buffer, size);
...free(buffer);
C語言中scanf 函式的返回值
c語言中簡單的輸入scanf函式和輸出printf函式,我們經常使用,也很熟悉,但有時卻還是會在這兩個地方犯錯。scanf 函式 功 能 執行格式化輸入 用 法 int scanf char format argument,scanf 函式是通用終端格式化輸入函式,它從標準輸入裝置 鍵盤 讀取輸入的...
c語言中fgetc 函式返回值的問題
fgetc返回值的型別 以 1 中的 為例 fgetc 返回型別為int,我們可以將其返回值賦給乙個int型別變數,如 1 中的 即使是遇到字元0xff blank的ascii碼,不是eof while迴圈也不會結束,因為0xff會被轉化0x000000ff,顯然這與0xffffffff eof 是...
C語言函式如何正確返回陣列?
includeint function int main 程式執行結果 接著把注釋掉的那段 取消注釋 程式執行結果 難道就因為加了一句話,就出錯?可是我除了輸出啥也沒幹啊 實際上我們返回陣列的方法是錯誤的,問題的根源在於 我們在function函式中,定義區域性變數a,返回的是a的位址,而a是乙個區...