C++ 如何正确初始化类函数中的指针?
我正在使用一个类中声明的指针数组来指向另一个数组。当指针数组元素初始化为main中的某个值时,该值也会被带到它所指向的数组元素。下面的代码显示了这一点,并且工作正常。但是,如果我在init类函数中初始化指针,我会得到一个segfault。另外,如果我试图从指针数组中访问一个未在main中初始化的元素,我也会得到一个segfaultC++ 如何正确初始化类函数中的指针?,c++,function,class,pointers,C++,Function,Class,Pointers,我正在使用一个类中声明的指针数组来指向另一个数组。当指针数组元素初始化为main中的某个值时,该值也会被带到它所指向的数组元素。下面的代码显示了这一点,并且工作正常。但是,如果我在init类函数中初始化指针,我会得到一个segfault。另外,如果我试图从指针数组中访问一个未在main中初始化的元素,我也会得到一个segfault #include <stdio.h> #include <stdlib.h> #include <iostream> using
#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";
}
有没有一种方法可以在类函数中初始化指针数组而不导致segfault?这是因为LWgt中存储的指针都没有指向任何有效的指针。请记住,运行时将使用一些随机值初始化指针,这些随机值可能是有效地址,也可能不是有效地址。当你试图在一个无效地址中填充一个值时,你会得到一个错误 您需要初始化LWgt中的指针,以指向某些实际的双内存位置,然后才能将任何值分配给它们:
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函数。Lwgt是指向double的指针数组。您必须分配数组中的每个元素或删除声明中的**
LWgt = new double*[26];
为26 double*分配内存,但不为指针本身分配内存
线路
*LWgt[5] = 22.34543;
导致未定义的行为,因为尚未为LWgt的任何元素分配内存
为了能够使用它,您必须首先为LWgt[5]分配内存
请正确缩进你的代码。你是怎么做到的?我刚刚用了ctrl k。你听说过构造函数吗?你从哪里学的这些东西?是的,我知道构造函数和析构函数,但我通常不使用它们。这能让它工作吗?行LWgt=new double*[26];将指针类型的26个元素分配给double。所有这些元素都没有指向任何东西。非常感谢这一点,现在我想起来它是如此明显——我需要像对待其他数组一样对待指针数组。谢谢你。
LWgt[5] = new double[<SOME_SIZE>]; // Allocate an array
LWgt[5] = new double; // Allocate just one element.