我正在使用一个在类中声明的指针数组来指向另一个数组。当指针数组元素初始化为main中的值时,该值也被传送到它指向的数组元素。以下代码显示了这一点,它工作正常。但是,如果我在init类函数中初始化指针,我会得到一个段错误。此外,如果我尝试从未在main中初始化的指针数组中访问元素,我也会得到段错误。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class testclass {
public:
double *Wgt;
double* *LWgt;
void init() {
Wgt = new double[26];
LWgt = new double*[26];
//segfault from here
*LWgt[5] = 22.34543;
}
};
int main() {
testclass *node;
node = new testclass[10];
for (int i = 0; i < 10; i++) {
node[i].init();
}
for (int i = 0; i < 5; i++) { //init_nconn here
node[i].LWgt[23] = &node[i + 5].Wgt[12];
}
node[6].Wgt[12] = 50.6987;
node[8].Wgt[12] = 0.999923;
cout << *node[1].LWgt[23] << *node[3].LWgt[23] << "--\n";
//No segfault
*node[1].LWgt[23] = 33.234;
cout << node[6].Wgt[12] << "---\n";
//No segfault here
cout << *node[1].LWgt[23] << "---\n";
//Segfault from here
cout << *node[3].LWgt[5] << "---\n";
}
有没有办法在类函数中初始化指针数组而不会导致段错误?
答案 0 :(得分:1)
LWgt = new double*[26];
为26 double*
分配内存,但不为指针本身分配内存。
该行
*LWgt[5] = 22.34543;
导致未定义的行为,因为尚未为LWgt
的任何元素分配内存。
为了能够使用它,你必须先为LWgt[5]
分配内存。
LWgt[5] = new double[<SOME_SIZE>]; // Allocate an array
或
LWgt[5] = new double; // Allocate just one element.
答案 1 :(得分:0)
那是因为LWgt
中存储的指针实际上都没有指向任何有效的指针。请记住,运行时将使用一些随机值初始化指针,该随机值可能是也可能不是有效地址。当您尝试在无效地址中填入值时,您将收到错误。
您需要初始化LWgt
内的指针以指向一些实际的double
内存位置,然后才能为其分配任何值:
void init() {
Wgt = new double[26];
LWgt = new double*[26];
for(int i = 0; i < 26; i++)
LWgt[i] = new double;
//segfault from here
*LWgt[5] = 22.34543;
}
作为旁注,这种初始化可能最好在您的类的构造函数内完成,而不是特殊的初始化函数。构造函数的关键是它们总是在实例化类时自动运行。您不必担心在创建对象后立即记住调用init函数。
答案 2 :(得分:0)
Lwgt是一个指向double的指针数组。您必须分配数组中的每个元素或删除声明中的**。