【问题标题】:Creating an array of pointers to structures - C++创建指向结构的指针数组 - C++
【发布时间】:2013-10-15 06:10:52
【问题描述】:

我无法理解指向结构的指针数组。我创建了这个简单的示例来尝试更好地理解它们。尽管它可以编译,但我在下面显示的点处不断收到“BAD ACCESS”崩溃(无意义的指针)。谁能解释为什么这是错误的?

#include <iostream>
using namespace std;

struct complex_num {
    double real_part;
    double imag_part;
};

void init_complex(complex_num *element) {
    element->real_part = -1.0;             // <--- EXECUTION STOPS HERE.
    element->imag_part =  1.0;
}

int main(int argc, char *argv[]) {
    int n = 5;

    complex_num *array[n]; // Allocates for an array of n pointers to
                           // the complex_num structure, correct?

    for (int i = 0; i < n; i++) {
        init_complex(array[i]);
    }

    return 0;
}

我知道有更好的方法可以做到这一点。我知道这是非常 C 的风格。请不要建议不同的数据结构。我特别好奇结构指针数组。谢谢!

【问题讨论】:

    标签: c++ arrays pointers structure


    【解决方案1】:

    您没有为 complex_num 对象分配内存,只是为带有指向它的指针的数组分配内存。因此,当您调用 init_complex 时,它对指向无效位置的指针进行操作。

    试试这个:

    for (int i = 0; i < n; i++) {
        array[i] = new complex_num();
        init_complex(array[i]);
    }
    

    您的语句complex_num *array[n] 创建了一个包含n 个指向complex_num 的指针的数组。意思是,数组可以保存n pointers 到 complex_num;但指针本身仍未初始化。它们指向随机位置 - C++ 中的每个未初始化的原语(指针也属于)通常只包含分配之前内存位置中的任何值。这几乎肯定会导致意想不到的结果,因为没有办法(或至少没有相当简单的方法)告诉未初始化的指针指向哪里。

    因此,您必须使数组中的每个指针都指向某个正确设置的包含complex_num 的内存位置;只有在那之后,您才应该访问(读取或写入)指针指向的complex_num 中的值。使其成为例如指向一个动态分配的新 complex_num 对象,使用上面的代码(注意 new 关键字,它执行动态分配)。

    旁注:“原始”指针,指向动态分配的对象,如上所示,处理起来很棘手(完成后不要忘记调用delete,否则会泄漏内存),因此推荐实践通常是使用智能指针(如 std::shared_ptr,由 C++11 引入)。

    【讨论】:

      【解决方案2】:

      是的,没有为您声明的指针分配内存。它没有指向任何有效的结构对象

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多