malloc()分配不成功?

chinaplus 2006-04-25 11:19:55
我在编写程序过程中,当分配一个空间很大的时候,譬如malloc(1024*1024*1024*sizeof(char))
总是返回分配不工作,windows不是有虚拟内存一说吗,这样的空间大小应该是可以分配的了?
...全文
367 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wbf420 2006-04-26
  • 打赏
  • 举报
回复
VirtualAlloc)
Snow_Ice11111 2006-04-26
  • 打赏
  • 举报
回复
至于楼主的问题,我的用下面代码:
#include <iostream.h>
#include <afx.h>

void main()
{
char *b=(char*)malloc(1024*1024*1024*sizeof(char));
if (!b) cout<<"malloc fail"<<endl;
free(b);
}
测试结果是,分配失败,我的物理内存248M,上面代码运行的后操作系统立刻提示虚拟内存不足。不知这是否为正解,请朋友们指正!
Snow_Ice1111 2006-04-26
  • 打赏
  • 举报
回复
犯了个低级的错误,结果应是:
#include <iostream.h>
#include <afx.h>

struct aa
{
int b;
char c;
};

void main()
{
aa *a=(aa*)malloc(1024*sizeof(aa));
cout<<&a[0]<<endl;
cout<<&a[1]<<endl; //结果(两者之差)显示每个数组元素占用8个字节

char *b=(char*)malloc(1024*sizeof(char));
cout<<(void*)&b[0]<<endl;
cout<<(void*)&b[1]<<endl; //结果(两者之差)显示每个数组元素占用1个字节
free(a);
free(b);
}
Snow_Ice11111 2006-04-26
  • 打赏
  • 举报
回复
以上代码匆匆而就,因为测试未用free释放空间之误,请大家正式代码中勿要学我^_^
Snow_Ice11111 2006-04-26
  • 打赏
  • 举报
回复
不过我最初的回复中提到的malloc(1048576*sizeof(short));实测是只用了2M的空间,特此更正一下,并向楼主和大家致歉!希望不会误导各位朋友。
Snow_Ice11111 2006-04-26
  • 打赏
  • 举报
回复
写了段代码专门测试了一下,结果如下:

#include <iostream.h>
#include <afx.h>

struct aa
{
int b;
char c;
};

void main()
{
aa *a=(aa*)malloc(1024*sizeof(aa));
cout<<&a[0]<<endl;
cout<<&a[1]<<endl; //结果(两者之差)显示每个数组元素占用8个字节

char *b=(char*)malloc(1024*sizeof(char));
void *c1=(void*)b[0],*c2=(void*)b[1];
cout<<&c1<<endl;
cout<<&c2<<endl; //结果(两者之差)显示每个数组元素占用4个字节
}
会思考的草 2006-04-25
  • 打赏
  • 举报
回复
一次分配过大的内存会导致问题的。
Snow_Ice11111 2006-04-25
  • 打赏
  • 举报
回复
至于malloc(1024*1024*1024*sizeof(char))分配这样的空间是否会按空间对齐?期待有朋友能把实际的验证结果告诉大家一下,我没试过。
Snow_Ice11111 2006-04-25
  • 打赏
  • 举报
回复
一个进程的寻址空间是2^32空间可以有4G了,这个是没错,但操作系统要占用2G归它分配,所以实际上如楼上thisisll(速度八十迈)朋友说的只有2G了。另外,你一下分配了1G的空间,但malloc命令分配空间时会遵循字节对齐原则,如编译器设置成4个BYTE对齐,而你用如下命令分配:malloc(1048576*sizeof(short));表面上看只要2M空间就够了,实际上可能要4M的空间。
happyness44 2006-04-25
  • 打赏
  • 举报
回复
你要这么大空间干吗

实在要用这么大空间,,最好是分段

及时释放数据空间
chinaplus 2006-04-25
  • 打赏
  • 举报
回复
一个进程的寻址空间是2^32空间可以有4G了,
WIN32为每一个进程提供一个可达4G的虚拟的,并且是连续的地址空间。
BBirdlyh(BBird),堆空间默认大小,是编译器默认的吗?还是系统设定?
3x!
thisisll 2006-04-25
  • 打赏
  • 举报
回复
理论上是2G
可是你不能全用来放数据
cpio 2006-04-25
  • 打赏
  • 举报
回复
太大了,虚拟也不够吧?
BBirdlyh 2006-04-25
  • 打赏
  • 举报
回复
malloc是在堆上分配的空间,堆空间默认大小我记不清了,肯定没你想要得那么打
跟虚拟内存是两回事,如果想操作虚拟内存的话用VIRTUALALLOC之类的函数
BBirdlyh 2006-04-25
  • 打赏
  • 举报
回复
malloc sets errno to ENOMEM if a memory allocation fails or if the amount of memory requested exceeds _HEAP_MAXREQ.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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