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 的风格。请不要建议不同的数据结构。我特别好奇指向结构的指针数组。谢谢!

4

2 回答 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,否则会泄漏内存),因此推荐的做法通常是使用 smart指针(如 std::shared_ptr,由 C++11 引入)。

于 2013-10-15T06:14:37.570 回答
1

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

于 2013-10-15T06:52:46.650 回答