当前位置:   article > 正文

C语言如何实现动态⼆维数组?_c语言 动态多维数组

c语言 动态多维数组

一、问题

        C语言如何实现动态⼆维数组?

二、解答

          在C语言中,动态创建二维数组的方法通常是通过动态分配内存来实现的。

方法一:逐行动态分配

        首先,创建一个指针数组(即一维数组),其元素为指向整型数据的指针(对应二维数组的每一行)。

        然后,使用 malloc 函数为每一行分配内存,使得每一行都能容纳指定数量的列元素。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void free_2d_array(int ***arr, int rows)
  4. {
  5. for (int i = 0; i < rows; ++i)
  6. {
  7. free((*arr)[i]);
  8. }
  9. free(*arr);
  10. }
  11. int **create_2d_array(int rows, int cols)
  12. {
  13. int **arr = (int **)malloc(rows * sizeof(int *));
  14. if (arr == NULL)
  15. {
  16. perror("Failed to allocate memory for row pointers");
  17. return NULL;
  18. }
  19. for (int i = 0; i < rows; ++i)
  20. {
  21. arr[i] = (int *)malloc(cols * sizeof(int));
  22. if (arr[i] == NULL)
  23. {
  24. // 如果某一行内存分配失败,则释放之前分配成功的行内存
  25. for (int k = 0; k < i; ++k)
  26. {
  27. free(arr[k]);
  28. }
  29. free(arr);
  30. perror("Failed to allocate memory for a row of data");
  31. return NULL;
  32. }
  33. }
  34. return arr;
  35. }
  36. int main()
  37. {
  38. int rows = 3, cols = 4;
  39. int **arr = create_2d_array(rows, cols);
  40. // 使用和初始化数组
  41. if (arr != NULL)
  42. {
  43. // ...
  44. // 对 arr[i][j] 进行读写操作
  45. // ...
  46. // 释放内存
  47. free_2d_array(&arr, rows);
  48. }
  49. return 0;
  50. }

方法二:连续内存分配

        另一种方法是计算总元素数量,一次性分配足够的内存来存储所有元素,并计算每个元素的偏移量模拟二维数组的访问:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void free_continuous_2d_array(int **arr, int rows, int cols)
  4. {
  5. free(arr);
  6. }
  7. int **create_continuous_2d_array(int rows, int cols)
  8. {
  9. int **arr = (int **)malloc(rows * sizeof(int *) + rows * cols * sizeof(int));
  10. if (arr == NULL)
  11. {
  12. perror("Failed to allocate memory for array");
  13. return NULL;
  14. }
  15. // 创建指向数组每一行的指针
  16. int *data = (int *)(arr + rows);
  17. for (int i = 0; i < rows; ++i)
  18. {
  19. arr[i] = data + i * cols;
  20. }
  21. return arr;
  22. }
  23. int main()
  24. {
  25. int rows = 3, cols = 4;
  26. int **arr = create_continuous_2d_array(rows, cols);
  27. // 使用和初始化数组
  28. if (arr != NULL)
  29. {
  30. // ...
  31. // 对 arr[i][j] 进行读写操作
  32. // ...
  33. // 释放内存
  34. free_continuous_2d_array(arr, rows, cols);
  35. }
  36. return 0;
  37. }

三、总结

        动态⼆维数组要动态分配指针数组才能实现。

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