求助,malloc分配内存问题

feiya121 2011-12-13 05:11:28

#include <stdio.h>
#include <stdlib.h>
#define N 250000000

int main()
{
int i;
double *x;

if(!(x = malloc(N * sizeof(double)) ))
printf("memory error \n");

free(x);
}



总是说内存错误,我有8G内存呀。为何会这样呢,如何解决呀?
...全文
233 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
msrend 2011-12-14
  • 打赏
  • 举报
回复
支持11楼,楼主要注意细节。
赵4老师 2011-12-14
  • 打赏
  • 举报
回复
如果有一天,你老无所依,……哦不,你真需要比如64GB的数组的话,可以用文件读写模拟内存读写,用_lseeki64函数移动文件读写位置。
绿野耕夫 2011-12-14
  • 打赏
  • 举报
回复
malloc是从堆上分配内存,你确定你有8G内存就能有8G的堆吗?
「已注销」 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 feiya121 的回复:]

因为的确是需要一个大数组。信号频率是30MHz,然后取样频率是100MHz,这样很容易就要很大的内存来存数组。
[/Quote]

google earth的数据需要多大的内存?

你下载一个3D游戏看看,一般都10G左右,为什么仅仅1G内存的机器就可以跑?

「已注销」 2011-12-14
  • 打赏
  • 举报
回复
再者,在free时,要判断指针是否为空。因为free(NULL)是很bug的。。。

----

这个早不是bug了,而被写进了堆标准,堆可以接受free(0)
feiya121 2011-12-13
  • 打赏
  • 举报
回复
因为的确是需要一个大数组。信号频率是30MHz,然后取样频率是100MHz,这样很容易就要很大的内存来存数组。
TMAC10052120353 2011-12-13
  • 打赏
  • 举报
回复
寻址问题,如果开了PAE的话,可以到36G,楼主申请的太大了
自信男孩 2011-12-13
  • 打赏
  • 举报
回复
申请这么大的空间,你是不是想让系统崩溃吗?8G的内存不可能都给你用啊,malloc是在堆上申请的空间,你确定你的堆有这么大的空间吗?我估计一个程序也用不了这个大的一个空间吧。
jiutianc 2011-12-13
  • 打赏
  • 举报
回复
8g应该不会都分配给堆吧,会留出部分来
AnYidan 2011-12-13
  • 打赏
  • 举报
回复
什么东西都有个限度,

google virtual memory
狂且 2011-12-13
  • 打赏
  • 举报
回复
我猜猜猜哈, 你的应该是 64 位操作系统, 如果是 32 位的, 只能寻址到 4G.

8G分配不到, 因为操作系统要占用一些内存空间, 还有为硬件保留的内存. 所以你不可能分配到 8G.

因为 malloc() 分配的是堆里的. 即使你有8G. 毕竟你的程序归操作系统管. 你现在要占领操作系统的

空间. 他当然不愿意.

你可以试试 7G\6G . PS: 错了请指正. 谢谢.
iamnobody 2011-12-13
  • 打赏
  • 举报
回复
2G内存,申请不到是被限制了大小,也没办法的事啊。弄小点的吧。
turing-complete 2011-12-13
  • 打赏
  • 举报
回复
你这个内存要求是连续的,而实际上有没有连续的给你用,也不清楚。
hik_zty 2011-12-13
  • 打赏
  • 举报
回复
楼主,你要做的时夯实自己的基础

首先,定义指针时,要赋值,是好的习惯。

其次,malloc返回值是void * ,若希望其为double类型的指针,强制转换一下

再者,在free时,要判断指针是否为空。因为free(NULL)是很bug的。。。
yanghuatian 2011-12-13
  • 打赏
  • 举报
回复
建议LZ,可以找找计算机原理方面的书,在系统内存的分配上,是有一个规则的。如果知道这个,就能理解这个肯定是有一定限制的。简单说,关于内存分配或是数据存储分配,都是按照地址来划分的,在定义前,系统会自动分配一个大小,这就是一个限制,如果超出了,就会出错,当然不同的系统处理方法不同。
而一般常用的程序是不会出现那种情况的,即使出现也会有相应的解决办法。
君子美玉 2011-12-13
  • 打赏
  • 举报
回复
32位系统下,一个进程的虚拟空间是4G,linux下你一次最大能分配的堆空间是2.9G,windows是1.9G左右(可以改配置变成2.9G),如果你想用上8G内存的话,改装64位的操作系统就OK了
zhozhoyu 2011-12-13
  • 打赏
  • 举报
回复
原因:楼主分配的空间太大了,内存是操作系统维护的,再说堆大小肯定比8G小很多?
解决方法:分配小点,用多少就分配多少!
  • 打赏
  • 举报
回复
操作系统是虚拟内存,~~~~

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧