如何在一个分配C中动态分配二维数组

时间:2017-04-30 19:10:24

标签: c malloc allocation

你能帮我弄清楚如何在一次分配呼叫中分配2D阵列吗?

我试着这样做:

  

int ** arr =(int **)malloc(num * num * sizeof(int *));

但它不起作用。

<ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu> <MenuItem Header="Change" Click="ChangeStatus_Click"/> <MenuItem Click="MenuItem_OnClick"> <MenuItem.Style> <Style TargetType="{x:Type MenuItem}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsActive}" Value="True"> <Setter Property="Header" Value="off"/> </DataTrigger> <DataTrigger Binding="{Binding Path=IsActive}" Value="False"> <Setter Property="Header" Value="on"/> </DataTrigger> </Style.Triggers> </Style> </MenuItem.Style> </MenuItem> </ContextMenu> </Setter.Value> </Setter> </Style> </ListView.ItemContainerStyle> 是行和列。

3 个答案:

答案 0 :(得分:4)

  

如何在1中分配C

动态分配array2D

让我们从2D阵列开始:
2D array or "array 3 of array 4 of int"

的示例
int arr1[3][4];
arr1[0][0] = this;

OP的代码声明pointer to pointer to int,不是2D数组,也不是指向2D数组的指针 顺便说一句,演员不需要。

int** arr = (int**)malloc(num * num * sizeof(int*));

代码可以为2D数组分配内存并返回指向该内存的指针。 pointer to array 5 of array 6 of int

 int (*arr2)[5][6] = malloc(sizeof *arr2);
 if (arr2 == NULL) return EXIT_FAILURE;
 (*arr2)[0][0] = this;
 return EXIT_SUCCESS;

 // or with Variable Length Arrays in C99 and optionally in C11
 int (*arr3)[num][num] = malloc(sizeof *arr3);
 (*arr3)[0][0] = that;

或者代码可以为1D数组分配内存并返回指向该内存的指针。 pointer to array 8 of int。有时这通常是人们想要的“分配2D”数组,实际上是指向一维数组的指针

 int (*arr4)[8] = malloc(sizeof *arr4 * 7);
 arr4[0][0] = this;

 // or
 int (*arr5)[num] = malloc(sizeof *arr5 * num);
 arr5[0][0] = that;

答案 1 :(得分:0)

您可以使用以下两种方式之一分配2D数组。

1:指向数组的指针

这将是:

int rows = 10; 
int cols = 10;
int **array = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
    array[i] = malloc(cols * sizeof(int));
}

array现在将指向每个表示一行的指针列表,这些指针将指向行中的元素。在这种情况下,您可以使用array[n][m]

访问第n行和第m列

2:单连续块

这可能是您想要的方法,您可以在一次分配中完成所有操作。这将要求您以二维表示形式存储二维数组。

int rows = 10; 
int cols = 10;
int *array = malloc(rows * cols * sizeof(int));

然后,您可以使用偏移量存储和检索第n行和第m列:array[(n * cols) + m]

答案 2 :(得分:0)

虽然我想到了&#34; 2D整数数组的含义&#34;毫无疑问是int arr[10][10]之类的东西,在网上搜索带来的解释就像&#34;使用一系列指针&#34;或者&#34;使用指向指针的指针&#34; (例如,参见this post)。此答案的其余部分基于int arr[r][c]形式的2D数组,其中r表示行数,c表示每行的列数。

如果不支持可变长度数组,则至少c必须是const表达式(即在编译时已知)。相反,r也可以在运行时定义,使得至少行数是动态的&#34;。然后可以将2D阵列表示为一个D阵列的(可能是不完整的)阵列:

#define COLS 3

void printArray(int array[][COLS], int rows) {
    for(int row=0; row<rows; row++) {
        for (int col=0; col<COLS; col++) {
            printf("%d ", array[row][col]);
        }
        printf("\n");
    }
}

int main() {

    typedef int oneD[COLS];

    int rows = 5;
    size_t myArray5RowsSize = rows*sizeof(oneD);
    oneD *myArray5Rows = malloc(myArray5RowsSize);
    memset(myArray5Rows,0,myArray5RowsSize);
    myArray5Rows[0][0] = 0;
    myArray5Rows[1][1] = 1;
    myArray5Rows[2][2] = 2;

    printArray(myArray5Rows, 5);

    return 0;
}