如何在C ++中返回二维数组

时间:2009-12-20 21:46:49

标签: c++

我在这一行有一个分段错误:

cout <<  b[0][0];

有人可以告诉我应该怎么做才能修复我的代码?

#include <iostream>
using namespace std;

int** gettab(int tab[][2]){
   return (int**)tab;
}

int main() {
   int a[4][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}};
   int ** b = gettab(a);
   cout <<  b[0][0];
   return 0;
}

5 个答案:

答案 0 :(得分:6)

二维数组与指针数组不同,这就是解释int**的方式。更改gettab的返回类型。

int* gettab(int tab[][2]){
   return &tab[0][0];
}

int main() {
  int a[4][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}};
  int* b = gettab(a);
  cout << b[0]; // b[row_index * num_cols + col_index]
  cout << b[1 * 2 + 0]; // the 1 from {1, 0}
}

或者:

int (*gettab(int tab[][2]))[2] {
  return tab;
}
// or:
template<class T> struct identity { typedef T type; };
identity<int(*)[2]>::type gettab(int tab[][2]) {
  return tab;
}

int main() {
  int a[4][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}};
  int (*b)[2] = gettab(a);
  cout << b[0][0];
}

答案 1 :(得分:3)

作为c ++,而不是c,有much better种处理各种数组的方法,并传递它们。

答案 2 :(得分:2)

没有方括号的tab类型实际上不是int **。它实际上是int (*)[2]。当您将两个[]运算符应用于结果指针时,最终会取消引用数组中的第一个值0作为NULL指针。试试这个:

#include <iostream>
using namespace std;

typedef int (*foo)[2];

foo gettab(int tab[][2]){
   return tab;
}

int main() {
   int a[4][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}};
   foo b = gettab(a);
   cout <<  b[0][0];
   return 0;
}

答案 3 :(得分:1)

你的段错误我们因为你有效地传入了“int *”。 2D数组不是双指针......

你最好使用大小为“x * y”的指针并在没有2维的情况下对其进行寻址...无论如何编码将最终相同,因为编译器只会生成相同的代码。无论如何写得更明确:)

答案 4 :(得分:0)

2 diminsional数组与指针数组不同。一个二维数组只是一个指向一大块内存的指针,你告诉编译器让你以二维数组的形式访问

int* gettab(int tab[][2]) {   
   return (int*)tab;
}

int main() {   
   int a[4][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}};   
   int* b = gettab(a);   
   cout <<  b[0 + 2*0];   
   return 0;
}

会做你想要的。但我想知道你是否真的需要尝试从函数返回一个二维数组。如果你想要做的事情会有所帮助,也许是一个不那么简单的例子?

编辑:在计算[0 +(sizeof(int)* 2)* 0]中修复缺失* 2。 再次编辑:那是愚蠢的。在这种情况下,列大小2乘以int的大小是自动的。 sizeof(int)已删除。