malloc()与realloc()用法
malloc()与realloc()
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <alloc.h>
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
举例:
///注: 例子是sno_guo写的。
// malloc.c
#include <stdio.h>
#include <stdlib.h>
#define MALLOC_SIZE 1024*1024
main()
{
int *p;
int i;
int *p1;
///注意这个地方一定要加上sizeof(int) 如不加则p是int类型,一次访问4个字节的内存,这样实际可写的内存大小是MALLOC_SIZE/4,
///假如你写入了MALLOC_SIZE大小的数据,就造成了数组的越界。
p=(int *)malloc(sizeof(int)*MALLOC_SIZE);
if(p)
printf("Memory Allocated at: %x\n",p);
else
printf("Not Enough Memory!\n");
p1=p;
for(i=0;i<MALLOC_SIZE;i++)
{
*p=i;
p++;
}
free(p1); ///注意这里:如果直接释放p会导致内存错误,看man手册: free() frees the memory space pointed to by ptr, which must have been
/* returned by a previous call to malloc(), calloc() or realloc(). Other‐
wise, or if free(ptr) has already been called before, undefined behav‐
ior occurs. If ptr is NULL, no operation is performed.*/
return 0;
}
看看这个个问题程序(这里用的是TC编译器):
#include "stdlib.h"
#include "stdio.h"
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
*(i+1)=2;
printf("%x|%d\n",i,*i);
printf("%x|%d",i+1,*(i+1));
}
输出的结果是:
8fc|1
8fe|2
这个程序编译通过,运行正常,说它有问题,问题出在哪呢?首先通过malloc,建了一个大小为2的堆,i指向的地址是8fc,i+1指向的地址是8fc+sizeof(int)=8fe。但是地址8fe是不受保护的,因为它不是机器分配给i+1的,随时会被其他变量占用。
正确的做法是
#include "stdlib.h"
#include "stdio.h"
void main()
{
int *i;
i=(int *)malloc(sizeof(int));
*i=1;
i=(int *)realloc(i,2*sizeof(int));
*(i+1)=2;
printf("%x|%d\n",i,*i);
printf("%x|%d",i+1,*(i+1));
}
realloc 可以对给定的指针所指的空间进行扩大或者缩小,"提z网R9教R育5b5的无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。
所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc (p, sizeof(int) *15);
甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
int* p = (int *) realloc (0,sizeof(int) * 10); //分配一个全新的内存空间,
这一行,作用完全等同于:
int* p = (int *) malloc(sizeof(int) * 10);
『附注:TC编译器里sizeof(int)=2,VC里面sizeof(int)=4;
char型在两个编译器里是一样的,都是1个字节(8位)』
calloc与malloc相似,参数nelem为申请地址的单位元素长度,elsize为元素个数,如:
char* p;
p=(char*)calloc(sizeof(char),20);
这个例子与上一个效果相同
realloc
原型:extern void *realloc(void *mem_address, unsigned int newsize);
用法:#include <alloc.h>
功能:改变mem_address所指内存区域的大小为newsize长度。
说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
举例:
// realloc.c
#include <syslib.h>
#include <alloc.h>
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
getchar();
p=(char *)realloc(p,256);
if(p)
printf("Memory Reallocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
相关函数:calloc,free,malloc