没有足够的空间用于C中的全局数据

时间:2014-07-26 15:33:39

标签: c global-variables

这是我的previous问题 这是我的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程序中的全局数据空间不足。在任务管理器中,我可以看到“Mem Usage”增加到268344k并且进程崩溃。如果PROD_MAX100000,那么“内存使用”的另一个较小值也会崩溃。如果PROD_MAX较小,请说50000,那么就不会发生崩溃。我的系统有1GB RAM。我该怎么办?有一个简单的简单解决方案吗?

1 个答案:

答案 0 :(得分:2)

一般规则是避免消耗大量资源,除非您确定需要全部资源。

在你的现实生活中是一样的:如果你不确定要吃掉所有香蕉,你就不会买几千吨香蕉。

因此,您应该malloc每个人struct Product。然后,您能够处理的产品数量取决于操作系统能够为您提供的(虚拟)内存量。

不要忘记至少使用一些致命的错误消息来测试malloc的失败:

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

然后始终立即初始化newprod的每个字段。原则上你应该在程序结束前养成free每个这样的记忆区的习惯。

如果您觉得您的特定计算机没有足够的资源来解决您的实际问题(您正在计算的实际问题),那么您需要获得更多资源,这会成为一种社交(例如要求您的经理购买)更大的计算机)或经济问题(花费大量资金购买庞大的服务器),或编程错误的症状(然后所需的资源是开发时间)。

当然“很多资源”的意思是主观的,并且在过去有所不同:当我十几岁(20世纪70年代)时,一兆字节的RAM是一个巨大的数额。今天,一块GB的RAM不会花费太多。但是你今天可能买不起1TB的RAM。 (也许当你退休时,你家里可能有太字节的RAM。)

一些着名的科学家(Dijkstra也许)说过:“计算机科学是资源的数学”

或许将name字段设为strdup(3) - ed字段。您应该猜测是否值得付出努力(您认为是“平均”名称长度是什么?我不知道)并相应调整您的代码。

同样,指针pProducts的大数组本身可以动态堆分配(例如,您可以使用realloc(3)malloc作为指针数组。你最初可以分配100个指针,例如

时,将它增加一半(newsize = 3*oldsize/2;)。

阅读关于C memory managementfragmentationvirtual memorygarbage collectionmemory leakmemory poolbuffer overflow的wikipages(和谷歌搜索)关于“记忆过度使用”)你可能会感兴趣。