【发布时间】:2024-01-09 06:23:02
【问题描述】:
我想在 C 中创建一个二维数组。
我知道一种方法可以做到这一点。
#include <stdlib.h>
void my_func(int **arr)
{
printf("test2: %d\n", arr[0][1]);
}
int main(void)
{
const int row = 3;
const int col = 4;
int **arr = (int **)malloc(sizeof(int *) * 3);
arr[0] = (int *)malloc(sizeof(int) * 4);
arr[1] = (int *)malloc(sizeof(int) * 4);
arr[2] = (int *)malloc(sizeof(int) * 4);
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[0][3] = 4;
arr[1][0] = 3;
arr[1][1] = 4;
arr[1][2] = 5;
arr[1][3] = 6;
arr[2][0] = 5;
arr[2][1] = 6;
arr[2][2] = 7;
arr[2][3] = 8;
printf("test1: %d\n", arr[0][1]);
my_func(arr);
}
在这种情况下,数组可以作为参数传递给函数。 但它不是那么漂亮。 如果数组有很多值(例如 20*20),我需要逐行键入每个值。
于是我搜索了一下,找到了一种制作这样一个数组的方法。
#include <stdio.h>
void my_func(int **arr)
{
printf("test2: %d", arr[0][1]);
}
int main(void)
{
const int row = 3;
const int col = 4;
int arr[row][col] = {
{1,2,3,4},
{3,4,5,6},
{5,6,7,8}
};
printf("test1: %d", arr[0][1]);
my_func(arr);
}
它很简洁,不会让我筋疲力尽。 但是当数组传递给函数时出现了问题。 并且在编译的时候会出现如下警告
test_2D_array.c:20:11: warning: incompatible pointer types passing 'int [3][4]' to
parameter of type 'int **' [-Wincompatible-pointer-types]
my_func(arr);
^~~
test_2D_array.c:3:20: note: passing argument to parameter 'arr' here
void my_func(int **arr)
^
1 warning generated.
甚至函数也无法访问数组参数。存在分段错误。
所以我想知道制作数组的最佳方法,该数组可以作为参数传递给任何函数,并且比我的第一个代码更不累。
感谢您的阅读。
【问题讨论】:
-
在你的情况下:
arr不是int **;它实际上是一个int [][4]或int *[4]。 -
您的第一个示例 不是 一个二维数组,因为 C 执行它[您的第二个示例 是 一个二维数组]。您的第一个是指向 [separate] 一维数组的 指针 数组。这就是不具有二维数组的语言所做的(例如
perl和python)。您的第二个:将功能更改为:void my_func(int row,int col,int arr[row][col]) { ... }并调用 [来自main] 与:my_func(row,col,arr); -
您确定
int arr[row][col] = { {1,2,3,4},...};有效吗?我收到error: variable-sized object may not be initialized -
将数组传递给函数时出现问题 那是因为
int **arr = (int **)malloc(sizeof(int *) * 3);然后arr[0] = (int *)malloc(sizeof(int) * 4); ...不创建二维数组 .不好意思喊了,但是“多个malloc()二维数组”实际上是一个指向多个完全独立的一维数组的指针的一维数组。它实际上不是一个数组。见Correctly allocating multi-dimensional arrays -
@AndrewHenle 您大喊的问题是可以使用
arr[y][x]语法访问该数组。所以它表现得“好像”它是一个二维数组。换句话说,它确实创建了一个二维数组,而不是您对二维数组的狭义定义。
标签: c multidimensional-array declaration definition variable-length-array