c++ - 创建指向结构的指针数组 - C++

标签 c++ arrays pointers structure

我无法理解指向结构的指针数组。我创建了这个简单的例子来尝试更好地理解它们。虽然它可以编译,但我在下面显示的点上不断出现“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 的风格。请不要建议不同的数据结构。我特别好奇结构指针数组。谢谢!

最佳答案

您没有为您的 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 个指向 complex_num 的指针;但指针本身仍未初始化。它们指向随机位置 - C++ 中每个未初始化的原语(指针也属于)通常只包含分配前内存位置中的任何值。这几乎肯定会导致意想不到的结果,因为没有办法(或者至少没有相当简单的方法)告诉未初始化的指针指向哪里。

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

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

关于c++ - 创建指向结构的指针数组 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19374359/

相关文章:

c++ - 比较悬空指针是否合法?

c++ - setter 方法中的 make_shared 行为类似于创建拷贝

php - 查询背后的实时搜索引擎逻辑

jquery - JavaScript : how to loop through an array upon each call

c - 变量如何在堆栈上表示?

c++ - 新表达式会返回一个指向数组的指针吗?

c++ - 用另一个字符序列替换 C++ std::string 中的字符/字符序列

c++ - 在发出绘制信号之前获取 Gtk::DrawingArea 大小

c++ - 现代 C++ 实现具有可变数量的 int 参数的函数的最佳方法

C 比较数字,存储在数组中,并打印