11动态堆内存空间分配与释放

#include <stdlib.h>//栈:int a=5;===4字节,int a[5];===4*5=20字节

void* malloc (

  size_t size // 预分配字节数

);

成功返回所分配内存的起始地址,失败返回NULL。不初始化。

void* calloc (

  size_t nmemb, // 元素数

  size_t size // 元素字节数

);

成功返回所分配内存的起始地址,失败返回NULL。初始化为0。

所有通过动态内存分配所得到内存都要通过free()函数释放。

void free (

  void* ptr // 内存地址

);

void* realloc (

  void* ptr, // 原地址

  size_t size // 新字节数

);

成功返回调整后的内存地址,失败返回NULL。新增部分不做初始化。

如果ptr为NULL,则与malloc()等效。

如果size为0,则与free()等效。

可能会分配新的内存空间,如果发生这种情况,原内存会自动释放,其内容会拷贝到新内存中,但是如果分配失败,原内存不会释放。

 

#include <stdio.h>
#include <stdlib.h>
//int* p;p==永远都是保存一块地址或区域 书架第二行,第四列有一本书
//*p==地址或区域上的值或目标  C语言 
int main()
{
  int* p=(int*)malloc(sizeof(int));//动态申请4个字节大的堆内存
  *p=1;//写一个游戏超级武器的爆率0.00001%
  printf("%d\n",*p);//1
  //printf("%p\n",p);
  free(p);
  //p=NULL;
  //printf("%p\n",p);
  //*p=2;//100%
  printf("%d\n",*p);//1?2?
  p=(int*)calloc(5,sizeof(int));//5*4
  int i;
  for(i=0;i<5;i++)//0-4
    p[i]=i;
  for(i=0;i<5;i++)
    printf("%d ",p[i]);
  printf("\n");
  free(p);
  p=(int*)realloc(NULL,512*sizeof(int));//512*4 void*
  if(!p)
  {
    return -1;
  }
  *p=10000;
  //如果发现p指针分配内存不够用了,怎么办?
  int* p2=(int*)realloc(p,1024*sizeof(int));//1024*4
  //重新分配的内存是根本P的申请内存去增大,
  //会自动把p内存里面的值直接拷贝到p2的内存。
  if(!p2)
  {
    return -1;
   }
  printf("*p=%d,*p2=%d",*p,*p2);
  free(p);
  free(p2);
  return 0;
} 

 

posted @ 2017-09-04 20:20  gd_沐辰  阅读(376)  评论(0编辑  收藏  举报