基本上我想做的是在一个函数中初始化我的数组,但它会出现段错误:
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);
}
最佳答案
这里困扰您的是 C(和 C++)缺少按引用参数传递。 main()
中的a
与func()
中的a
不同:
a
在main
中声明。a
按值传递(因为没有其他方式)到func
。func
中的a
被赋值给。func
返回。它的a
被破坏(内存泄漏),main
的a
未初始化。- ???
main
尝试使用a
。 段错误!
这里有一些可能的解决方案:
使用经典的 C 方法:传递指向值的指针。在这种情况下,参数将是
int ***a
,这有点荒谬,但无论如何。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); ... }
以 C++ 方式进行:传递引用。
void func(int **&a, int x, int y) { // ^ // This is the only change. Neat!
以正确的方式(在我看来):从函数返回一个值,然后从该值初始化数组。
int **func(int x, int y) { int **a = new int*[x]; // EDIT: Fixed stupid typo bug // existing code return a; } int main(int argc, char **argv) { ... int **a = func(2, 3); ... }
关于c++ - 通过引用 C++ 初始化指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17778059/