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

时间:2013-10-15 06:10:52

标签: c++ arrays pointers structure

我无法理解结构指针数组。我创建了这个简单的例子来尝试更好地理解它们。虽然它编译,但我仍然在下面显示的点上“崩溃访问”崩溃(无意义指针)。任何人都可以解释为什么这是错的吗?

#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 个答案:

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

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

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

答案 1 :(得分:1)

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