C中的全局数据空间不足

C中的全局数据空间不足,c,global-variables,C,Global Variables,这是我的问题 以下是我的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[

这是我的问题 以下是我的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使用”增加到
268344k
,进程崩溃。如果
PROD_MAX
100000
,则“Mem用法”的另一个较小值也会崩溃。如果
PROD_MAX
较小,比如
50000
,则不会发生崩溃。我的系统有1GB内存。我该怎么办?有一个简单易行的解决方案吗?

一般的规则是避免消耗大量资源,除非您确定需要所有资源

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

因此,您应该,例如,
malloc
每一个
struct-Product
。那么,您能够处理的产品数量将取决于您的操作系统能够提供给您的(虚拟)内存量

不要忘记测试
malloc的故障,至少要有一些致命的错误消息:

struct Product *newprod = malloc(sizeof Product);
if (!newprod) { 
   perror("not enough memory for a Product"); exit(EXIT_FAILURE);
}
然后始终立即初始化
newprod
的每个字段。原则上,您应该养成在程序结束前释放每个这样的内存区的习惯

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

当然,“大量资源”的含义是主观的,在过去有所不同:当我还是一个青少年(1970年代)时,一兆字节的RAM是一个巨大的数量。如今,一个千兆字节的RAM并不昂贵。但今天,您可能负担不起一TB的RAM。(也许当你退休时,家里可能有TB的RAM)

一些著名的科学家(可能是Dijkstra)说:“计算机科学是资源的数学”

也许将
名称
字段设置为某些字段。您应该猜测这是否值得付出努力(您认为“平均”名称长度是多少?我不知道),并相应地修改您的代码

类似地,指针的大数组
pProducts
本身可以动态地进行堆分配(例如,您可以对该指针数组使用或
malloc
)。您可以首先将其分配给100个指针,例如,当指针满时,将其增加一半(
newsize=3*oldsize/2;


阅读关于、、(和谷歌搜索“内存过度使用”)的wikipages可能会让你感兴趣。

我想知道崩溃是否是因为数据量以外的原因。你显示的数据大约为
(268+4)*1000000=27200000=259.4MB
。你有足够多的内存来处理这个问题,尤其是考虑虚拟内存。C++是你的选择吗?C++字符串可能比使用每一个产品名称的256字节更有效率。@ EXTIENE或简单的MALLC字符串数据,并在Stutt.OOGA中存储一个指针,或者简单的Maloc(有时,ReAlLc)将数组的大小保持在最小值。我会将realloc(当数组变满时)分成固定的块,或者根据需要将每次的大小增加一倍。我会为它malloc一个数组,只有在数组满时才realloc该数组(通过一大块)。需要一点簿记,但可以防止内存碎片化,而且性能更高。@RudyVelthuis:我同意你的观点,但OP可能是一些孩子在学习如何编程。当然,如果你单独对每一个产品进行malloc,你就需要一个地方来存储指向它们的指针,并且有同样的问题,除非你想教他关于链表的知识。如果我有多一点时间,我会写一个简单的程序来演示我的意思。我有几个例子,但它们是在Delphi中,所以在这里没有用。这个讨论忽略了一点,那就是它可能根本不是内存问题。