初始化二维数组的函数

时间:2018-07-14 14:24:19

标签: c arrays

我有一个我想在其中初始化二维数组的c程序。 所以我做了这个功能:

void initLayer(int **layer, int *dimensions) {
    printf("initLayer\n");
    layer = malloc(sizeof(int*) * dimensions[0]);
    for (int i = 0; i < dimensions[0]; i++) {
        layer[i] = malloc(sizeof(int) * dimensions[1]);
    }
}

使用此功能没有问题,但是稍后尝试读取2D数组时,总是会遇到分割错误。 我认为可能是因为函数完成时未保存初始化。 您知道我该如何纠正我的功能吗?预先谢谢你。

3 个答案:

答案 0 :(得分:2)

要将指针传递给函数,您还需要一个指针。 int **matrix;是一个数组数组,因此要填充它,您需要将其作为指针int ***layer传递。但这很奇怪。 同样,要通过指针更改数据,您需要在其前添加星号**layer = ...

#include <stdlib.h>


void initLayer(int ***layer, int *dimensions)
{
    *layer = malloc(sizeof(int *) * dimensions[0]);

    for (int i = 0; i < dimensions[0]; i++)
    {
        *(*layer + i) = malloc(sizeof(int) * dimensions[1]);
    }
}


int main()
{
    int **matrix;
    int dimensions[2] = { 4, 6 };

    initLayer(&matrix, dimensions);

    // then do whatever you want
    for (int i = 0; i < dimensions[0]; i++)
    {
        for (int j = 0; j < dimensions[1]; j++)
        {
            matrix[i][j] = i * j;
        }
    }
}

对我来说,最好使用typedef使代码更具可读性:

#include <stdlib.h>


typedef int *  Array;
typedef int ** Matrix;


void initLayer(Matrix *layer, Array dimensions)
{
    *layer = malloc(sizeof(Array) * dimensions[0]);

    for (int i = 0; i < dimensions[0]; i++)
    {
        (*layer)[i] = malloc(sizeof(int) * dimensions[1]);
    }
}


int main()
{
    Matrix matrix;
    int dimensions[2] = { 4, 6 };

    initLayer(&matrix, dimensions);

    // then do whatever you want
    for (int i = 0; i < dimensions[0]; i++)
    {
        for (int j = 0; j < dimensions[1]; j++)
        {
            matrix[i][j] = i * j;
        }
    }
}

答案 1 :(得分:1)

调用函数时,将复制int **layer指针。因此,当您执行layer = malloc(...)时,该函数实际上将其本地副本设置为malloc的结果。您想要的是对调用该函数的变量进行突变。您可以通过使用int ***layer并在调用&layer时传递initLayer来实现。请注意,然后必须在代码中使用*layer而不是layer

答案 2 :(得分:1)

您在这里有两种方法:

  • 将引用传递给双指针(在这种情况下为***int
  • 或返回分配的指针作为函数的结果:

在第一种情况下:

void initLayer(int ***layer, int *dimensions) {
    printf("initLayer\n");
    *layer = malloc(sizeof(int*) * dimensions[0]);
    for (int i = 0; i < dimensions[0]; i++) {
        layer[i] = malloc(sizeof(int) * dimensions[1]);
    }
}

您传递对指针的引用,而不传递(未初始化的)指针。请记住,在C语言中,所有参数均按值传递。在这种情况下,您可以将函数调用为:

...
int**vector;
...
initLayer(&vector, dims);  /* you pass the address of your double pointer */

在第二种情况下:

int** initLayer(int *dimensions) { 
    printf("initLayer\n");
    int **layer = malloc(sizeof(int*) * dimensions[0]);
    for (int i = 0; i < dimensions[0]; i++) {
        layer[i] = malloc(sizeof(int) * dimensions[1]);
    }
    return layer;
}

在这种情况下,您将其称为:

...
int**vector;
...
vector = initLayer(dims);  /* you receive your double pointer as a return value */