c - C 中的全局数据空间不足

标签 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,那么“Mem Usage”的另一个较小值也会发生崩溃。如果 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 的每个字段。原则上,您应该养成在程序结束前释放-ing 每个这样的内存区域的习惯。

如果您觉得您的特定计算机没有足够的资源来解决您的实际问题(您正在计算的现实世界问题),您将需要获得更多资源,这就变成了一种社交(例如要求您的经理购买更大的计算机)或经济问题(花很多钱购买大型服务器),或编程错误的症状(那么所需的资源就是开发时间)。

当然,“大量资源”的含义是主观的,并且在过去有所不同:在我十几岁的时候(1970 年代),1 兆字节的 RAM 是一个巨大的数量。如今,1 GB 的 RAM 成本并不高。但是您今天可能买不起 1 TB 的 RAM。 (也许当您退休时,家里可能有数 TB 的 RAM)。

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

也许 name 字段是一些 strdup(3) -ed 字段。您应该猜测这是否值得付出努力(您认为“平均”名称长度是多少?我不知道)并相应地调整您的代码。

同样,大指针数组 pProducts 本身可以动态分配堆(例如,您可以为该指针数组使用 realloc(3)malloc)。您最初可以为它分配 100 个指针,例如当它变满时将其增加一半 (newsize = 3*oldsize/2;)。

阅读有关 C memory management 的维基页面, fragmentation , virtual memory , garbage collection , memory leak , memory pool , buffer overflow (并在谷歌上搜索“内存过度使用”)您可能会感兴趣。

关于c - C 中的全局数据空间不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24972623/

相关文章:

c - 如何将字符串加载到结构中?

c - 双链表的堆栈模拟

c++ - 全局变量和静态全局变量

go - 在 if..else 语句中未声明变量

python - 如何访问父 python 函数末尾的 if/elif 语句中定义的变量?

c - 在C中读取、比较和获取输入非ASCII字符(即孟加拉语和其他印度文字)数组

c - 你如何在SDL2中设置光标位置?

vb.net - 在 Visual Studio 2010 和 VB.NET 中声明全局变量

c - 这里怎么修改这个变量的值

python - 如何获取新定义的变量