【发布时间】:2015-11-15 06:22:41
【问题描述】:
所以,我最近尝试这样做:
void Foo(int **bar, int size) {
bar = new int *[size];
for (int i = 0; i < size; i++)
bar[i] = new int[4];
// Do other stuff
return;
}
int main(int argc, char *argv[]) {
int ** data;
int size = atoi(argv[1]);
Foo(data, size);
for (int i = 0; i < size; i++) {
for (int j = 0; j < 4; j++)
cout << "i = " << i << ", j = " << j << ", data = " << data[i][j] << endl;
// Do other stuff
}
for (int i = 0; i < size; i++)
delete[] data[i];
delete[] data;
return 0;
}
而且我总是会在cout 语句中得到一个段错误。在更改代码以便在main 中动态分配数组后,问题就消失了。因此,段错误之间的区别在于数组是否在同一函数中动态分配和销毁。这对我来说似乎是错误的,因为这不应该是传统 C++ 的问题。我正在使用带有 Xcode 的 MacBook 来执行 g++ 命令。其他人可以确认 Xcode 的实现是这样做的吗?
【问题讨论】:
-
由于指针管理不善,您的代码会调用未定义的行为。您的 C++ 编译器或安装没有问题。
-
如果您在调用
Foo后检查了data的值,您应该看到data根本没有改变。这就是所有给你的答案都会解释的。另外:stackoverflow.com/questions/27487495/… -
@PaulMcKenzie 在我打电话给
Foo之后,我确实检查了data,我确实注意到它没有改变。但是,我的印象是,发送任何指向函数的指针都是通过引用传递的。下面给出的答案确实解释了我的问题,谢谢 -
一个更好的例子是,如果您在调用
Foo之前将数据设置为NULL。您会看到data仍然是 NULL,因此您的cout将使用 NULL 指针(未定义的行为)。不,发送指针是按值传递的,与传递的任何其他值类型没有什么不同。 C++ 中的传递引用意味着完全——传递引用。指针不是引用。
标签: c++ ios xcode dynamic-arrays