动态分配的二维数组

Posted

技术标签:

【中文标题】动态分配的二维数组【英文标题】:Dynamically allocated 2 dimensional array 【发布时间】:2013-11-24 02:05:13 【问题描述】:

我正在尝试通过动态分配来构建二维数组。我的问题是它的第一个维度是否有可能取 100 个值,然后第二个维度会根据我的问题取可变数量的值?如果有可能,那么我将如何访问它?我怎么知道第二维的边界?

【问题讨论】:

这完全取决于你如何实现二维数组。它是一个数组数组(例如int matrix[M][N])还是一个标准数组,您将两个“逻辑”维度应用于(例如int matrix[M*N])? 【参考方案1】:

(见代码中的cmets)

结果你会得到一个如下所示的数组:

// Create an array that will contain required variables of the required values
// which will help you to make each row of it's own lenght.
arrOfLengthOfRows[NUMBER_OF_ROWS] = value_1, value_2, ..., value_theLast;

int **array;
array = malloc(N * sizeof(int *));   // `N` is the number of rows, as on the pic.

/*
if(array == NULL) 
    printf("There is not enough memory.\n");
    exit (EXIT_FAILURE);

*/

// Here we make each row of it's own, individual length.
for(i = 0; i < N; i++) 
    array[i] = malloc(arrOfLengthOfRows[i] * sizeof(int)); 

/*
if(array[i] == NULL)  
    printf("There is not enough memory.\n");
    exit (EXIT_FAILURE);        

*/

【讨论】:

这忽略了问题对动态大小的内部数组的请求。 @Martin,你到底是什么意思? (如果我对问题的理解不正确,我会删除这个答案) &lt;pedenatic&gt;您的代码无法按原样编译。我要么删除#include,要么将其余代码封装在一个函数中。包含#include 行在某种程度上暗示这是一个可编译的示例。 来自问题:“那么根据我的问题,第二维将采用可变数量的值”。您正在分配固定数量的元素。 干得好。为图像 +1,以及在单独的数组中跟踪长度的想法。【参考方案2】:

您可以使用 100 个指针的数组:

int *arr[100];

然后你可以动态地为 100 个指针中的每一个分别分配你想要的任何大小的内存,但是你必须记住你分配了多少内存(对于每个指针),你不能指望 C 编译器记住它或告诉它对你来说,即sizeof 在这里不起作用。

要访问任何(允许的,在边界内)位置,您可以简单地使用 2D 数组表示法,例如要访问分配给20th 指针的5th 内存位置,您可以使用arr[20][5]*(arr[20] + 5)

【讨论】:

要跟踪每个内部数组中的项目数,请将数组包装在存储大小的结构中,或者将其更改为 int **arr[100] 并在值上使用“空终止”。 【参考方案3】:

我相信 OP 想要为数组提供一块内存,并且愿意修复其中一个维度来获得它。在用 C 编码时,我也经常喜欢这样做。

我们过去都能够做到double x[4][];,编译器会知道该怎么做。但显然有人把这件事搞砸了——甚至可能是有充分理由的。

以下仍然有效,允许我们使用大块内存,而不必进行大量指针管理。

#include <stdio.h>
#include <stdlib.h>

// double x[4][];

struct foo 
    double y[4];
 * x;

void
main(int ac, char * av[])

    double * dp;
    int max_x = 10;
    int i;

    x = calloc(max_x, sizeof(struct foo));
    x[0].y[0] = 0.23;
    x[0].y[1] = 0.45;
    x[9].y[0] = 1.23;
    x[9].y[1] = 1.45;

    dp = x[9].y;
    for (i = 0; i < 4; i++)
        if (dp[i] > 0)
            printf("%f\n", dp[i]);

诀窍是在结构中声明固定维度。但请记住,“第一”维度是动态维度,“第二”维度是固定的。这与旧方式相反......

您必须自己跟踪动态维度的大小 - sizeof 无法帮助您。

使用匿名的东西,你甚至可以摆脱 'y'。

【讨论】:

【参考方案4】:

使用单个指针:

int *arr = (int *)malloc(r * c * sizeof(int));

/* 如何访问数组元素 */

for (i = 0; i <  r; i++)
  for (j = 0; j < c; j++)
     *(arr + i*c + j) = ++count;  //count initialized as, int count=0;

使用指针指向指针:

int **arr = (int **)malloc(r * sizeof(int *));
for (i=0; i<r; i++)
     arr[i] = (int *)malloc(c * sizeof(int));

在这种情况下,您可以像访问静态分配的数组一样访问数组元素。

【讨论】:

以上是关于动态分配的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

动态分配的二维数组

将二维数组复制到函数外部动态分配的二维数组

如何使用 C++ 中的指针动态分配和解除分配二维数组?

二维数组C++的动态分配

如何获取动态分配的二维数组的大小

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