基本上我要做的是在函数中初始化我的数组,但它是段错误的:
void func(int **a, int x, int y) {
a = new int*[x];
for (int i=0; i<x; i++)
a[i] = new int[y];
}
void main() {
int **a;
func(a, 2, 3);
}
但是如果我在函数外部初始化数组然后传递它,一切都很完美,我可以为它赋值/打印它们。我正在努力的是传递我的数组的引用,所以我不必在函数之外初始化它。
void func(int **a, int x, int y) {
for (int i=0; i<x; i++)
a[i] = new int[y];
}
void main() {
int x = 2;
int **a = new int*[x];
func(a, x, 3);
}
答案 0 :(得分:4)
你在这里咬你的是C(和C ++)没有参考参数传递。 a
中的main()
与a
中的func()
不同:
a
在main
中声明。a
按值(因为没有其他办法)传递给func
。a
中的func
已分配给。func
返回。其a
被破坏(内存泄漏),而main
的{{1}}未被初始化。a
尝试使用main
。 段错误!的 这里有一些可能的解决方案:
以经典的C方式执行:传递指向值的指针。在这种情况下,参数将是a
,这有点荒谬,但无论如何。
int ***a
以C ++方式执行:传递引用。
void func(int ***a, int x, int y) {
*a = new int*[x];
for (int i=0; i<x; i++)
(*a)[i] = new int[y];
}
int main(int argc, char **argv) {
...
int **a;
func(&a, 2, 3);
...
}
正确(在我看来)这样做:从函数返回一个值,然后从中初始化数组。
void func(int **&a, int x, int y) {
// ^
// This is the only change. Neat!
答案 1 :(得分:1)
您的原始代码所做的是修改func中的局部变量,而不是main中的局部变量。 这将做你想要的:
void func(int **&a, int x, int y) {
a = new int*[x];
for (int i=0; i<x; i++)
a[i] = new int[y];
}
void main() {
int **a;
func(a, 2, 3);
}
否则我无法理解为什么你会遇到段错误,除非你在调用func后尝试访问main中的数组。
答案 2 :(得分:0)
在你的第一个例子中。对func
的调用不会更改a
中main
的值。您可以让func
返回指向它创建的数组的指针,然后将该指针指定给main.
中的变量
更改示例代码如下所示:
int** func(int x, int y) {
int **a = new int*[x];
for (int i=0; i<x; i++)
a[i] = new int[y];
return a;
}
void main() {
int **a;
a = func( 2, 3);
}