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

4
我在这一行遇到了段错误:
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个回答

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

应该是:int (* gettab(int tab[][2])) [2]不过我建议不要返回数组 :) - DanDan
@Roger 这个踩赞不是我点的,但是你的第二个解决方案看起来很奇怪,并且在我的编译器(VS 2005)中无法编译通过,这对你有用吗? - Andreas Brinck
我的语法有误,已经修复并提供了一个更易读的替代方案。(int(*)[2] 的 typedef 也可以使用。) - Roger Pate
int (*gettab(int tab[][2]))[2] { return tab; } 能够工作,但是看起来很糟糕 :) 明天我会尝试使用Boost。非常感谢您的帮助。 - user56642
未知:我同意你可能有更好的解决方案,但由于你没有说出你真正要做什么,所以我只能修复你在问题中提供的示例。 :) - Roger Pate
显示剩余2条评论

3

相比于C语言,由于是C++,因此有更好的方法来处理各种数组并传递它们。

可以参考这里这里获取更多信息。


另一个好的链接:http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.11 “为什么我的矩阵类接口不应该像数组一样?” - danio
@danio 但是我的矩阵类接口看起来就像那样,哦不!D: - James

2

tab这种没有方括号的类型实际上不是int **,而是int (*)[2]。当你对结果指针应用两个[]运算符时,你最终会将数组中的第一个值0解引用为一个空指针。请尝试使用以下代码:

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

1

你的段错误是因为你传递了一个“int*”,一个2D数组不是双重指针...

最好使用一个大小为“x*y”的指针,而不带有2个维度的地址...代码最终将与编译器生成的代码相同,否则您必须更加明确地编写它 :)


0
一个二维数组并不等同于一个指针数组。一个二维数组只是一个指向一块内存的指针,你已经告诉编译器让你将其作为一个二维数组来访问。
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;
}

会做你想要的事情。但我想知道,你是否真的需要尝试从函数中返回一个二维数组。也许如果你能提供一个更具体的例子,会更有帮助?

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


b[0 + sizeof(int)*0] 中,sizeof(int) 究竟是做什么的? - avakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接