malloc()与realloc()用法

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

你可能感兴趣的:(malloc()与realloc()用法)