如何将多维数组分配给临时变量?

时间:2011-11-21 14:26:15

标签: c++

我想将一个静态分配的多维数组分配给一个临时变量。请考虑以下示例:

void foo(int b[3][2])
{
    b[1][1] = 1; // no segmentation fault
}

int main()
{
    int a[3][2] = {{1, 2}, {11, 12}, {21, 22}};

    foo(a);

    int** c;
    c = (int**)&a;
    c[1][1] = 1; // segmentation fault on execution

    int* d[3];
    d[0] = (int*)&(a[0]);
    d[1] = (int*)&(a[1]);
    d[2] = (int*)&(a[2]);
    d[1][1] = 1; // no segmentation fault

    return 0;
}

基本上我想做编译器对b的参数foo()所做的工作。但我唯一可以提出的解决方案是d。有没有那么复杂的方式?

6 个答案:

答案 0 :(得分:12)

cdeclman page)是你的朋友:

cdecl> explain int b[3][2]
declare b as array 3 of array 2 of int
cdecl> declare b as pointer to array 2 of int
int (*b)[2]

所以,试试这个:

void foo(int b[3][2])
{
    b[1][1] = 1; // no segmentation fault
}

int main()
{
    int a[3][2] = {{1, 2}, {11, 12}, {21, 22}};

    foo(a);

    int (*b)[2] = a;

    b[1][1] = 1;

    return 0;
}

答案 1 :(得分:9)

int[3][2]int**是不兼容的类型。你不能把一个扔到另一个。

试试这个:

int (*c)[2];
c = a; //no need to cast 
c[1][1] = 1; //ok

或者你可以这样做(声明和初始化):

int (*c)[2] = a; //no need to cast 
c[1][1] = 1; //ok

规则大拇指:

  • 不要在C ++中使用c样式强制转换。使用C ++ - 样式转换。如果你使用C ++风格的转换,编译器会在之前告诉你很多问题(ideone)(不需要运行代码来查看问题):

    prog.cpp:5: error: invalid static_cast from type ‘int (*)[3][2]’ to type ‘int**’
    

    但正如你所知,C风格的演员阵容很好(ideone)。

  • 每当你使用强制转换,甚至是C ++风格的强制转换时,如果程序无法按预期工作,你的第一个疑问应该是演员本身。

答案 2 :(得分:6)

正如您现在可能已经知道的那样,从其他答案来看,a的类型实际上并不等同于int** - 它jsut 衰减(返回时/通过价值传递。

int (*b)[2] = a; // would solve that

还有更多的C ++方式:

typedef std::array<std::array<int, 2>, 3> M23;

void foo(M23& b)
{
    b[1][1] = 1; 
}

int main()
{
    M23 a = {{1, 2}, {11, 12}, {21, 22}};

    foo(a);

    M23 d = a;
    d[1][1] = 1;
}

答案 3 :(得分:3)

如果您使用支持C ++ 11标准的足够部分的非常现代的编译器,则可以使用auto

int a[3][2] = ...;
auto &b = a;
b[1][1] = 1;  // a[1][1] will be set

当然,ab都必须在同一范围内定义才能发挥作用。例如,函数中不能有auto参数(这就是模板的用途。)

答案 4 :(得分:2)

请勿明确转换,请尝试编写

 c = &a;

然后GCC编译器(使用gcc -Wall -g bidim.c -o bidim编译)给出正确的警告:

bidim.c:13:7: warning: assignment from incompatible pointer type [enabled by default]

然后您应该意识到2D矩阵不是作为指向1D阵列的指针数组实现的。

答案 5 :(得分:0)

我想到的第一件事是使用typedef和类似

的引用
typedef int thing_t[3][2];
thing_t& e = a;
e[1][1] = 1;

使用指针

int (*f)[2] = a;
f[1][1] = 1;

另一种可能性是将其封装在struct