返回C中的2D数组的数组(指针)

时间:2016-04-06 11:37:39

标签: c arrays

一个函数动态创建一个int数组,其元素预定为int[2]。有没有办法让函数为该数组赋值,然后将其返回给调用者。

以下代码完成此任务,但会发出警告:initialization from incompatible pointer type [enabled by default]

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

int *get_values()
{
    int (*x)[2] = malloc(sizeof(int[2])*3);

    x[0][0] = 1;
    x[0][1] = 2;

    x[1][0] = 11;
    x[1][1] = 12;

    x[2][0] = 21;
    x[2][1] = 22;

    return x;   
}

int main()
{
    int (*x)[2] = get_values();

    int i;
    for (i=0; i!=3; i++)
        printf("x[%d] = { %d, %d }\n", i, x[i][0], x[i][1]);
}

我知道您动态分配两个维度的替代方案,但这是我很好奇的事情。

2 个答案:

答案 0 :(得分:6)

在这样的情况下,定义一个typedef可能会有助于重复相同的笨重语法。这样可以更容易地为get_values声明正确的返回类型:

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

typedef int I2[2];

I2 * get_values(void)
{
    I2 * x = malloc(sizeof(I2) * 3);

    x[0][0] = 1;
    x[0][1] = 2;

    x[1][0] = 11;
    x[1][1] = 12;

    x[2][0] = 21;
    x[2][1] = 22;

    return x;   
}

int main()
{
    I2 * x = get_values();

    int i;
    for (i=0; i!=3; i++)
        printf("x[%d] = { %d, %d }\n", i, x[i][0], x[i][1]);

    free(x);
}

LIVE DEMO

推荐阅读:Don't repeat yourself (DRY)

答案 1 :(得分:3)

这就是没有typedef时的外观:

int (*get_values(void))[2]
{  
    return NULL;   
}

非常不可读。

请注意,在该函数定义中,如果用{替换get_values(void),则得到:int (*x)[2],这正是指针定义的样子。