C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

C和指针之动态内存分配malloc、calloc、realloc简单使用和区别

1、介绍

3个函数都在<stdlib.h>头文件
1)、void* malloc(unsigned size);
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址,这里我们需要主要如果申请失败返回空指针

2)、void* realloc(void* ptr, unsigned newsize);  
给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度,地址可能会变

3)、void* calloc(size_t numElements, size_t sizeOfElement); 
参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,即在内存中申请numElements*sizeOfElement字节大小的连续地址空间
会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为0

用完要记得释放内存
free(p);
p = NULL;

都在堆区分配内存,用完都需要释放,都是连续的分配内存




2、测试Demo

3个函数简单使用

  
  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //malloc、realloc、calloc简单使用
  4. int main()
  5. {
  6. int *p1 = NULL;
  7. p1 = malloc(10 * sizeof(int));
  8. if (p1 != NULL)
  9. {
  10. //给p1赋值
  11. for (int i = 0; i < 10; ++i)
  12. {
  13. *(p1 + i) = 5;
  14. }
  15. //打印值
  16. for (int i = 0; i < 10; ++i)
  17. {
  18. printf("p1[%d] is %d\n", i, p1[i]);
  19. }
  20. free(p1);
  21. p1 = NULL;
  22. }
  23. int *p2 = NULL;
  24. p2 = calloc(5, sizeof(int));
  25. if (p2 != NULL)
  26. {
  27. for (int i = 0; i < 5; i++)
  28. {
  29. printf("p2[%d] is %d\n", i, p2[i]);
  30. }
  31. free(p2);
  32. p2 = NULL;
  33. }
  34. char *p3, *q4;
  35. p3 = (char *)malloc(5);
  36. q4 = p3;
  37. p3 = (char *)realloc(p3, 10)
  38. if (p3 != NULL)
  39. {
  40. printf("p3 is %p\n", p3);
  41. printf("q3 is %p\n", q4);
  42. p3 = (char *)realloc(p3, 1000);
  43. printf("p3 is %p\n", p3);
  44. free(p3);
  45. p3 = NULL;
  46. }
  47. return 0;
  48. }




3、 运行结果


  
  
  1. 1111deMacBook-Pro:malloc a1111$ vim malloc.c
  2. 1111deMacBook-Pro:malloc a1111$ gcc -g malloc.c -o malloc
  3. 1111deMacBook-Pro:malloc a1111$ ./malloc
  4. p1[0] is 5
  5. p1[1] is 5
  6. p1[2] is 5
  7. p1[3] is 5
  8. p1[4] is 5
  9. p1[5] is 5
  10. p1[6] is 5
  11. p1[7] is 5
  12. p1[8] is 5
  13. p1[9] is 5
  14. p2[0] is 0
  15. p2[1] is 0
  16. p2[2] is 0
  17. p2[3] is 0
  18. p2[4] is 0
  19. p3 is 0x7ff323c01020
  20. q3 is 0x7ff323c01020
  21. p3 is 0x7ff323c03260



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值