2012-10-27 55 views
0

字符緩衝區是否有最大大小?我有一個程序正在爲char緩衝區收集字符串並將其寫入proc文件。在某一點後,它似乎停止寫東西 - 那裏有太多東西嗎?什麼是最大尺寸,我可以解決這個問題?C中字符緩衝區的最大大小?

這是代碼。這是一個LKM - 是內核空間提供的limits.h文件嗎?

爲本:

const char* input = "hooloo\n"; 

下一頁:

int read_info(char *page, char **start, off_t off, int count, int *eof, void *data) 
{ 

    unsigned int mem; 
    char answer_buf[strlen(input) + 1 + 14]; 
    name_added = vmalloc(strlen(input) + 1 + 14); 
    strcpy(name_added, input); 
    strcat(name_added, extension); 
    mem = sprintf(answer_buf, "%s\n", name_added); 
    memcpy(page, answer_buf, mem); 
    return strlen(answer_buf) + 1; 
} 

所有在我的代碼是這樣的事情是事情remalloc緩衝區,並添加到它。此外,該read_info是爲procfile。這個問題是我一直向上面的代碼中添加上面的代碼 - 最終我加入了我的proc文件和文本中斷 - 它不會像我想要的那樣永遠持續下去) - =。

+3

顯示代碼。 'buffer'是一個靜態數組還是'malloc'ed? –

+0

字符串大小總是令人頭痛......它通常由您的使用和運行平臺來近似。我經常使用的兩種尺寸是255和10000 – texasbruce

+0

'begin_input'變成了多長時間? 'char answer_buf [strlen(begin_input)+ 1 + 14];如果堆棧變大,可能會溢出。 –

回答

2

「C」中沒有具體的最大尺寸。 C平臺上任何對象的理論(或「潛在」)最大大小由實現決定,通常從底層機器平臺和操作系統的屬性派生。

在具有平坦內存模型的平臺上,它通常受理論上地址空間的大小以及實際上可用空閒內存(或特定種類)的大小的限制。

在具有分段內存模型的平臺上,它可能受限於段大小,該大小小於地址空間大小。儘管通過在代碼中「模擬」平面內存模型,實現可以自由違反該限制。出於這個原因,在這樣的平臺上,最大對象大小也可以取決於編譯設置。

2

動態分配的字符緩衝區的唯一最大大小將是可用的系統內存。

堆棧上的緩衝區的大小受最大堆棧大小的限制。這將根據主機操作系統的不同而有很大差異

將數據寫入文件時,是否檢查由fwrite返回的大小,並在需要時重複調用以寫入剩餘的緩衝區?

+2

如果'buffer'是一個靜態大小的數組,那麼通常在達到系統內存限制之前,通常會碰到堆棧大小限制。答案對於動態分配的緩衝區是正確的。 – Praetorian

+0

好點,謝謝。我相應地更新了我的答案。 – simonc

-3

我會說這是至少能夠處理1000點獨特的字符

-1

你在你的代碼中的內存泄漏!

以下內存永遠不會被釋放:

name_added = vmalloc(strlen(input) + 1 + 14); 

我不明白爲什麼你的輸出分配內存的。 而且你在堆棧和堆上都做了兩次。

調用者爲輸出提供了一個緩衝區。 使用它! 不要創建副本!