讀書筆記 返回自動變數問題及解決方案

2021-04-12 19:23:51 字數 736 閱讀 4665

在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...