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

问题描述:

我想为一个临时变量分配一个静态分配的多维数组。请看下面的例子:如何将多维数组分配给临时变量?

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; 
} 

基本上我想要做的编译器与参数的foo()b什么。但是我能想到的唯一工作解决方案是d。有没有更简单的方法?

+0

奇怪的是,有多少人认为2D数组直接转换为指向指针的指针。 – tenfour

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; 
} 
+0

呵呵 - 这是新的。哪里/什么是cdecl? – sehe

+0

OMG _cdecl_:D:D:D我从来没有见过这样的:D在线版本:@sehe - http://cdecl.org/ –

+1

+1,感谢cdecl ;-) –

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样式转换编译它罚款(正如你已经知道的那样。

  • 而且,无论何时使用强制转换,即使是C++风格强制转换,如果程序无法正常工作,您的第一个疑问应该是强制转换。

+1

你有一个错字:) –

+1

@KirilKirov:固定。谢谢。 – Nawaz

如果您使用的是支持C++ 11标准的足够的零件相当现代的编译器,你可以使用auto

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

当然,无论ab必须定义在相同的范围内工作。你不能在例如功能的auto参数(这就是模板是。)

正如你现在可能知道,从其他的答案中,a的类型不是实际上相当于int** - 它仅仅指刚衰减到那个(当返回/通过值)。

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; 
} 
+1

+1大家都喜欢'std :: array' :-) –

+1

@sehe:这很好,但你也应该回答这个问题,并用OP的代码解释问题。一旦你解释了,你可以建议更好的替代解决方案。 – Nawaz

不显式转换,所以尽量写

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数组的指针数组来实现的。

是进入我的心是用一个typedef和参考样

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

随着指针

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

另一种可能性是将其封装在struct的第一件事情。