NodeInfoBlock *p,*q; //创建空闲数据块链表的操作指针
//分配大内存块
char *pNodeInfoBlock=(char *)malloc(sizeof(NodeInfoBlock)*BlockCount);
//指向空闲内存块
MPoll->pNodeInfoFree=(NodeInfoBlock *)pNodeInfoBlock;
//将分配好的大内存块,按照具体的结构切割为小块,并形成空闲数据块链表
p=(NodeInfoBlock *)MPoll->pNodeInfoFree;
for (i=1;i
q=((NodeInfoBlock *)MPoll->pNodeInfoFree+i);
p->next=q;
p=q;
}
q->next=NULL;
说明:
不管申请多大的内存,在物理内存分布上可能是不连续的,但对用户程序而言,虚拟地址一定都是连续的,连虚拟地址空间上都没有足够大的连续空间的话,分配就会失败。
的确直接用new就行
你试试
char *a = new char[1024ULL * 1024ULL * 1024ULL * 8ULL];
注意后面要带ULL代表无符号超长整型数值,否则会默认int导致溢出或符号问题
一楼说的很对!局部的非静态变量(包括数组)都是运行时在堆栈中分配内存的,而栈通常都是比较小的,一般只有一两M的样子。所以要在堆中申请较大的内存,写一个示例代码你看看:
#include
using namespace std;
int
main()
{
const int M = 1024;
const int N = 1024;
int ** Sort = new int*[M];
for(int i = 0; i < M; ++i)
{
Sort[i] = new int [N];
}
//...
for(int i = 0; i < M; ++i)
{
delete [] Sort[i];
}
delete [] Sort;
return 0;
}
当然你也可以使用全局的数组,但是相比new会有一些不同,比如你申请了一个1G大小的数组,"有可能"你编译好的文件就有1G多!具体请参看这里:
http://www.dutor.net/index.php/2009/08/size-of-exec/
malloc(1024*1024*1024*8)