我无法理解结构指针数组。我创建了这个简单的例子来尝试更好地理解它们。虽然它编译,但我仍然在下面显示的点上“崩溃访问”崩溃(无意义指针)。任何人都可以解释为什么这是错的吗?
#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风格。请不要建议不同的数据结构。我特别好奇指向结构的指针数组。谢谢!
答案 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)
是的,没有内存分配给您声明的指针。它没有指向任何有效的结构对象