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

3

我在理解指向结构体的指针数组时遇到了麻烦。我创建了这个简单的例子来更好地理解它们。虽然它可以编译,但我一直在得到“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。请不要建议使用不同的数据结构。我特别想了解一下指向结构体的指针数组。谢谢!

2个回答

4

您没有为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,否则会泄漏内存),因此推荐的做法通常是使用智能指针(例如 C++11 中引入的 std::shared_ptr)。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接