在c中,自動變數在堆疊中分配記憶體,當包含自動變數的函式或**塊退出時,它們所占用的記憶體便被**,他們的內容肯定會被下乙個所調的函式覆蓋.
解決這個問題的幾個方案:
1.返回乙個指向字串長量的指標
char *fun()
如果需要計算字串的內容就無能為力了!
2.使用全域性宣告的陣列
char *fun()
這適用於自建立字元的情況,缺點在於任何人都可能在任何時候修改這個全域性陣列.下次呼叫也會影響覆蓋此時陣列的內容.
3.使用靜態陣列
char *fun()
可以防止任何人修改此陣列,只有擁有指向該陣列的指標的函式(通過引數傳遞)才能修改.但是,函式下一次呼叫將覆蓋這個陣列的內容.所以呼叫者必須在此前使用或備份陣列內容.和全域性陣列一樣,大型緩衝區如果閒置不用是非常浪費記憶體的.
4.顯示分配一些記憶體,儲存返回的值
char *fun()
這個方法具有靜態陣列的優點,而且在每次呼叫時都建立乙個新的緩衝區,所以該函式以後的呼叫不會覆蓋以前的返回值.缺點在於必須承擔記憶體管理的責任.如果記憶體尚在使用就free或者"記憶體洩露"就會有bug
5.要求呼叫著分配記憶體來儲存函式的返回值,為了提高安全性,應指定緩衝區的大小(像fgets()一樣)
void fun(char *result,int size)
int main(void)
可以在統一**塊中進行malloc和free操作
讀書筆記 解決空箱調運問題的途徑
周武 王正 上海海事大學 中國水運 編輯部郵箱 2005年 10期 根據英國德魯航運 諮詢公司 2002年的調查和估算,在全球的貨櫃運量2.01億teu中,空箱的運量為4100萬teu。以平均288美元 teu的空箱調運費計算,班 司大概要多支出110億美元來完成空箱的 運輸 問題,其中還不包括在多...
讀書筆記 iOS 自動釋放池
一,nsobject類提供了乙個autorelease方法 id autorelease 該方法預先設定了一條將來在某個時間傳送的release訊息,其返回值是接收訊息的物件。retain訊息採用了相同的技術,使巢狀呼叫更加容易。當給乙個物件傳送autorelease訊息時,實際上是將該物件新增到n...
讀書筆記 iOS 自動釋放池
一,nsobject類提供了乙個autorelease方法 id autorelease 該方法預先設定了一條將來在某個時間傳送的release訊息,其返回值是接收訊息的物件。retain訊息採用了相同的技術,使巢狀呼叫更加容易。當給乙個物件傳送autorelease訊息時,實際上是將該物件新增到n...