当前位置:   article > 正文

大话C语言:第28篇 内存分配与释放

大话C语言:第28篇 内存分配与释放

1 malloc函数

函数说明:

  1. #include <stdlib.h>
  2. void *malloc(size_t size);
  3. 功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。
  4. 分配的内存空间内容不确定。
  5. 参数:
  6. size:需要分配内存大小(单位:字节)
  7. 返回值:
  8. 成功:分配空间的起始地址
  9. 失败:NULL

代码示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4. // 使用 malloc() 分配内存来存储 5 个整数
  5. int *array = (int *)malloc(5 * sizeof(int));
  6. // 检查 malloc() 是否成功分配了内存
  7. if (array == NULL) {
  8. printf("内存分配失败\n");
  9. return -1; // 返回非零值表示错误
  10. }
  11. // 初始化分配的内存中的整数
  12. for (int i = 0; i < 5; i++)
  13. {
  14. array[i] = i + 1;
  15. }
  16. // 打印整数的值
  17. printf("数组中各元素分别是:\n");
  18. for (int i = 0; i < 5; i++)
  19. {
  20. printf("%d ", array[i]);
  21. }
  22. printf("\n");
  23. // 释放分配的内存
  24. free(array);
  25. // 尝试访问已释放的内存可能会导致问题,所以不再使用 array 指针
  26. // 将指针设置为 NULL 以避免悬挂指针
  27. array = NULL;
  28. return 0;
  29. }

2 calloc函数

函数说明:

  1. #include <stdlib.h>
  2. void *calloc(size_t num, size_t size);
  3. 功能:该函数与malloc()类似,但它还需要一个额外的参数来表示要分配的元素数量。它会返回一个指向已初始化为零的内存块的指针。
  4. 参数:
  5. num指定要分配的元素数量。
  6. size指定每个元素的大小。
  7. 返回值:
  8. 成功:分配的内存块的指针
  9. 失败:NULL

代码示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4. // 使用 calloc() 分配内存来存储 10 个整数,并初始化为 0
  5. int *array = (int *)calloc(10, sizeof(int));
  6. // 检查 calloc() 是否成功分配了内存
  7. if (array == NULL)
  8. {
  9. printf("内存分配失败\n");
  10. return -1;
  11. }
  12. // 给数组中的每个元素赋一个值
  13. for (int i = 0; i < 10; i++)
  14. {
  15. array[i] = i * 2;
  16. }
  17. // 打印数组中的值
  18. printf("数组各个元素值分别是:\n");
  19. for (i = 0; i < 10; i++)
  20. {
  21. printf("%d ", array[i]);
  22. }
  23. printf("\n");
  24. // 释放分配的内存
  25. free(array);
  26. // 将指针设置为 NULL,避免悬挂指针
  27. array = NULL;
  28. return 0;
  29. }

3 realloc()函数

函数说明:

  1. #include <stdlib.h>
  2. void *realloc(void *ptr, size_t new_size);
  3. 功能:用于调整之前分配的内存块的大小。如果调整成功,它会返回指向新内存块的指针;如果失败,它会返回NULL
  4. 参数:
  5. ptr:指向一个之前由malloc(), calloc(), 或 realloc() 函数分配的内存块的指针。如果 ptr 是 NULL,那么 realloc() 的行为就如同 malloc(),分配一块大小为 new_size 的新内存。
  6. new_size:重新分配的内存块的大小,以字节为单位。
  7. 返回值:
  8. 如果内存重新分配成功,realloc() 返回指向新内存块的指针。这个指针可能与 ptr 相同(如果重新分配发生在原地),也可能不同(如果内存块移动了位置)。
  9. 如果内存重新分配失败,realloc() 返回 NULL,并且原内存块 ptr 保持不变(不会被自动释放)。

代码示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4. int *array = (int *)malloc(5 * sizeof(int));
  5. if (array == NULL) {
  6. perror("Memory allocation failed");
  7. return 1;
  8. }
  9. // 初始化数组
  10. for (int i = 0; i < 5; i++) {
  11. array[i] = i;
  12. }
  13. // 打印原始数组
  14. printf("Original array:\n");
  15. for (int i = 0; i < 5; i++) {
  16. printf("%d ", array[i]);
  17. }
  18. printf("\n");
  19. // 尝试将数组大小增加到10
  20. int *new_array = (int *)realloc(array, 10 * sizeof(int));
  21. if (new_array == NULL) {
  22. printf("内存重新分配失败\n");
  23. // 释放原始内存
  24. free(array);
  25. return 1;
  26. }
  27. // 更新指针
  28. array = new_array;
  29. // 初始化新分配的内存部分
  30. for (int i = 5; i < 10; i++)
  31. {
  32. array[i] = i;
  33. }
  34. // 打印新数组
  35. printf("扩展后的数组:\n");
  36. for (int i = 0; i < 10; i++)
  37. {
  38. printf("%d ", array[i]);
  39. }
  40. printf("\n");
  41. // 释放内存
  42. free(array);
  43. // 将指针设置为 NULL,避免悬挂指针
  44. array = NULL;
  45. return 0;
  46. }

4 free函数

函数说明:

  1. #include <stdlib.h>
  2. void free(void *ptr);
  3. 功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。
  4. 对同一内存空间多次释放会出错。
  5. 参数:
  6. ptr:需要释放空间的首地址,被释放区应是由malloc函数所分配的区域。
  7. 返回值:无

代码示例:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. int main() {
  4. int n = 0;
  5. printf("请输入要申请数组的个数: ");
  6. scanf("%d", &n);
  7. // 堆区申请 n * sizeof(int) 空间,等价int arr[n]
  8. int *arr = (int *)malloc(n * sizeof(int));
  9. if (arr == NULL)
  10. {
  11. printf("申请空间失败!\n");
  12. return -1;
  13. }
  14. for (int i = 0; i < n; i++)
  15. {
  16. // 给数组赋值
  17. arr[i] = i;
  18. }
  19. for (int i = 0; i < n; i++)
  20. {
  21. // 输出数组每个元素的值
  22. printf("%d, ", *(arr+i));
  23. }
  24. // 释放堆区空间
  25. free(arr);
  26. // 将指针设置为 NULL,避免悬挂指针
  27. array = NULL;
  28. return 0;
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/921041
推荐阅读
相关标签
  

闽ICP备14008679号