我在这一行有一个分段错误:
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;
}
答案 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)
答案 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)已删除。