【问题标题】:Creating dynamically allocated arrays using Xcode's g++使用 Xcode 的 g++ 创建动态分配的数组
【发布时间】: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


【解决方案1】:

这与 Xcode 或 g++ 无关 - 只是代码中的一个错误 - 您需要通过引用传递 bar 才能将其用作输出参数。

变化:

void Foo(int **bar, int size)

到:

void Foo(int ** &bar, int size)

请注意,通常最好使用例如std::vector 而不是用于数组等的裸 C 样式指针。

【讨论】:

  • 我真的不知道你能做到这一点
【解决方案2】:

您通过值将数据传递给 Foo,因此当您在 Foo 内部分配内存时,main() 中的数据保持未初始化。

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2010-10-03
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2016-02-22
    相关资源
    最近更新 更多