2012-10-31 105 views
2
char * return_buffer() 
{ 
    char buffer[1024]; 
    snprintf(buffer, sizeof(buffer), "%s", "test"); 
    return buffer; 
} 

緩衝區是在函數中創建的,我可以直接返回緩衝區嗎?函數返回後,緩衝區會消失?我可以返回在函數中創建的緩衝區嗎?

+0

[你是正確的(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope )。您需要動態分配一些內存,或者讓用戶執行該操作並傳入緩衝區以供使用。 – chris

回答

3

您正在創建一個靜態分配的緩衝區,這意味着它正在堆棧上創建。當函數返回時,它會給你一個不再使用的堆棧地址。所以如果你進行更多的函數調用,它存儲的數據可能會損壞。

通過調用malloc分配給堆好得多。

+2

請注意,在這種情況下「靜態分配」意味着:在編譯時分配已知的靜態數組大小。不要與關鍵字「靜態」和靜態存儲持續時間相混淆。 – Lundin

1

您將需要使用malloc在堆上分配緩衝區。
buffer是一個本地/自動變量,並不保證在函數返回後存在。使用超出函數範圍的任何此類緩衝區將導致未定義行爲。

0

是的。這個緩衝區是一個使用棧的局部變量,一旦你退出函數就會被釋放。使用malloc分配動態內存緩衝區。

0

在這種情況下,你不能。更喜歡你可以但你應該不這樣做。 這裏的buffer被創建在棧上,將被重用。

當您使用malloc或類似功能進行分配時,您可以返回。

0

這是不可能的,並可能導致崩潰。這裏內存分配在堆棧上,一旦函數返回,內存將被釋放。如果你想從一個函數返回緩衝區,那麼你必須在堆上分配內存。你可以使用malloc/calloc來做到這一點。閱讀more

+0

它不必崩潰。 – chris

+0

是的。糾正。既然這是非法的,我說它會崩潰。 – CCoder

0

不,你不能返回指向本地變量的指針。

編寫這些函數的最好方法是將分配留給調用者。優點是:1)代碼獨立於內存分配方法,可用於靜態和動態分配的內存,2)保持算法和內存分配的獨立性,從而使算法僅關注當前的主要任務而不關心與算法本身無關的副作用,例如內存分配。

這種程序設計是非常普遍的(例如它被Windows API使用)。

例子:

void print_buffer (char* buffer, size_t size) 
{ 
    snprintf(buffer, size, "%s", "test"); 
} 
相關問題