#include <stdio.h>
#include<malloc.h>
#define MAX 100000000
int main()
{
int *a[MAX];
int i;
for(i = 0; i < MAX; i++)
{
a[i] = (int *)malloc(MAX);
}
return 0;
}
2 realloc函数
原型:extern void *realloc(void* mem_address, unsigned int newsize);
语法:指针名=(数据类型 *)realloc(要改变内存大小的指针,新的大小)。新的大小一定要大于原来的大小,不然会导致数据丢失。
功能:先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址.
返回值:如果重新分配成功则返回指向被分配内存的指针(返回的也是void*的指针,需要进行强制类型转化),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放.
例子:
int *p;
p = (int *)malloc(1000*sizeof(int));
p = (int*)realloc(p, (1000+500)*sizeof(int));
free(p);
p=NULL;
内存分配情况
如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。
这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。
realloc()第二个参数的值如果是0,它的功能就相当于free
realloc()第一个参数的值如果是1,它的功能就相当于malloc