簡體   English   中英

C中的全局數據空間不足

[英]Not enough space for Global Data in C

這是我以前的問題,這是我的C代碼的一部分:

#define PROD_NAME_MAX 256
struct Product
{
    char name[PROD_NAME_MAX];
    long int quantity;
    long int category_id;
    char deleted;
};
#define PROD_MAX 1000000
struct Product products[PROD_MAX];
struct Product *pProducts[PROD_MAX];

我正在使用Windows XP和PellesC。 我無法理解C程序中沒有足夠的空間來存儲全局數據。 在任務管理器中,我可以看到“內存使用量”增加到268344k ,該過程崩潰了。 如果PROD_MAX100000那么“ Mem用法”的另一個較小值也會崩潰。 如果PROD_MAX較小,例如50000 ,則不會發生崩潰。 我的系統有1GB RAM 我該怎么辦? 有沒有簡單易用的解決方案?

一般規則是避免消耗大量資源,除非您確定需要所有資源。

在您的現實生活中也是如此:如果您不確定要全部吃掉香蕉,就不會買幾噸香蕉。

因此,例如,您應該malloc每個單獨的struct Product 然后,您將能夠處理的產品數量取決於操作系統能夠為您提供的(虛擬)內存量。

不要忘記至少通過一些致命錯誤消息來測試malloc失敗:

struct Product *newprod = malloc(sizeof Product);
if (!newprod) { 
   perror("not enough memory for a Product"); exit(EXIT_FAILURE);
}

然后總是立即初始化newprod每個字段。 原則上,您應該養成在程序結束之前free每個這樣的內存區域的習慣。

如果您認為您的特定計算機沒有足夠的資源來解決您的實際問題(您正在計算的現實世界中的問題),那么您將需要獲取更多的資源,這成為一種社交活動(例如,要求經理購買更大的計算機) ),經濟問題(花費大量金錢購買大型服務器)或編程錯誤的征兆(那么所需的資源就是開發時間)。

當然,“大量資源”的含義是主觀的,並且在過去曾發生過變化:當我十幾歲(1970年代)時,兆字節的RAM很大。 今天,1 GB的RAM成本不高。 但是您今天可能負擔不起TB的RAM。 (也許退休時,家里可能會有TB的RAM)。

一些著名的科學家(也許是Dijkstra)說過:“計算機科學是資源的數學”

也許具有name字段的是一些strdup(3) -ed字段。 您應該猜測是否值得這樣做( 您認為 “平均”名稱長度是多少?我不知道),並相應地修改您的代碼。

同樣,大型指針pProducts數組本身可以動態地進行堆分配(例如,對於該指針數組,您可以使用realloc(3)malloc )。 您最初可以為100個指針分配它,例如newsize = 3*oldsize/2;當它變滿時將其增加一半( newsize = 3*oldsize/2; )。

閱讀有關C內存管理碎片虛擬內存垃圾回收內存泄漏內存池緩沖區溢出 (以及在“內存過量使用”上進行谷歌搜索)的Wikipage對您可能很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM