malloc calloc realloc函数动态分配问题

   计算机中难得东西不像其他学科,去探究未知领域,计算机中的困难是怎么发现已知的东西,也就是说答案肯定存在,看个人有没有毅力去揭晓。今天看到一句话,想要吃掉一头鲸鱼,最有效的办法是一口一口吃。这句话对学计算机来说太合适了。
   malloc函数参数是所需字节的数目,返回值是所需类型的地址,比如
   int*pa=(int*)malloc(5*sizeof(int));
   这个语句这么理解:分配了5个int长度的字节,返回一个int型的地址,把这个地址存在了pa里。
   calloc函数通常和数组有关,也是分配动态内存,如果你使用了calloc,就可以用数组的思想运用它,当然也可以直接用地址的方式运用。
   int*pa=(char*)calloc(5,sizeof(int));
   这个语句分配了5个每个长度为int大小的字节,calloc分配指针地址的时候比较难理解,但运用比较多,比如:
   char**pa=(char**)calloc(5,sizeof(char*));
   这个语句常常用来当二维char型数组来使用和对待,这个语句分配了5个,每个大小为sizeof(char*)的字节,返回值也是地址,这个地址存在了pa中。但是pa中的值是calloc函数开辟内存的首地址,对pa进行*pa后,得到的是首地址内存中的值,这也是一个地址。并且对pa+i运用去地址符后,会得到分配内存中的值,就是一个个的地址,pa+0;pa+1,pa+2,pa+3等,记住要运用去地址符。
   关键是接下来的操作:
  char a[10];
  char*p=NULL;
  for(int i=0;i<5;++i);
 {  
  fgets(a,10,stdin);
 *(pa+i)=(char*)malloc((strnlen_s(a,10)+1)*sizeof(char));
 strcpy_s(*(pa+i),strnlen_s(a,10)+1,a);
  }
  上面是开辟对应输入字符串长度的内存,把地址写到*(pa+i)中,然后把a中内容复制到*(pa+i)中。
  realloc函数会使用有两种情况:
  1,char*pa=(char*)realloc(NULL,10*sizeof(char)),也就是硬分配10个,每个长度为sizeof(char)的字节,这时候,以pa为首地址的内存中的值为垃圾值,此时realloc相当于malloc;
  2,char*pa=(char*)realloc(p,10*sizeof(char));此时p是由malloc,或calloc函数分配的地址,假设里面有值(不是垃圾值),那么上面的语句就是重新开辟内存区域,且首地址是pa,但此时以pa为首地址的内存中有,以前p为首地址的内存中的值,有效值的长度要看,原来p的内存长还是现在pa的内存长,会复制两者之中小的长度内存的值。
  开辟动态内存区域后要及时释放内存。
  没有解不开的难题,因为答案肯定存在,就看个人有没有毅力去解开。
发布了21 篇原创文章 · 获赞 0 · 访问量 360

猜你喜欢

转载自blog.csdn.net/gaoxingzhe/article/details/104740102
今日推荐