如何将多维数组分配给临时变量?
我想为一个临时变量分配一个静态分配的多维数组。请看下面的例子:如何将多维数组分配给临时变量?
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
。有没有更简单的方法?
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;
}
呵呵 - 这是新的。哪里/什么是cdecl? – sehe
OMG _cdecl_:D:D:D我从来没有见过这样的:D在线版本:@sehe - http://cdecl.org/ –
+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++风格强制转换,如果程序无法正常工作,您的第一个疑问应该是强制转换。
你有一个错字:) –
@KirilKirov:固定。谢谢。 – Nawaz
如果您使用的是支持C++ 11标准的足够的零件相当现代的编译器,你可以使用auto
:
int a[3][2] = ...;
auto &b = a;
b[1][1] = 1; // a[1][1] will be set
当然,无论a
和b
必须定义在相同的范围内工作。你不能在例如功能的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大家都喜欢'std :: array' :-) –
@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
的第一件事情。
奇怪的是,有多少人认为2D数组直接转换为指向指针的指针。 – tenfour