我有一个表格的类定义
class X
{
public:
//class functions
private:
A_type *A;
//other class variables
};
和struct A_type定义为
struct A_type
{
string s1,s2,s3;
};
在构造函数中,我为A分配适当的内存并尝试A [0] .s1 =“somestring”; 它显示了分段错误。 这种声明是无效的,还是我遗漏了什么
编辑:OP的新代码已从评论[neilb]
移出#include <stdio.h>
#include <math.h>
#include <string>
#include <iostream>
using namespace std;
struct HMMStruct { string a; };
HMMStruct *HMMs;
int main() {
HMMs=(HMMStruct*)malloc(sizeof(HMMStruct)*2);
HMMs[0].a="sdfasasdsdfg";
cout << HMMs[0].a << endl;
}
答案 0 :(得分:3)
为什么不:
class X
{
public:
//class functions
private:
A_type a;
};
换句话说,为什么动态分配A_type实例?
编辑:您发布的新代码的问题在于它使用了malloc()。如果使用malloc(),则不会调用构造函数,这对于像POD这样的非POD类型是必不可少的。您不应该在C ++程序中使用malloc - 所有内容都应该使用new来分配,这将正确地调用构造函数:
HMMs= new HMMStruct[2];
你的代码并不真正适用于char *成员 - 它显然不会失败。
答案 1 :(得分:1)
'分配内存'是什么意思?你不得不说'新A_type'。如果你只是调用malloc,那么构造函数将不会运行,并且赋值将不起作用。
答案 2 :(得分:1)
在构造函数中,我为A分配适当的内存并尝试A [0] .s1 =“somestring”;它显示了分段错误。这种声明是无效的,还是我遗漏了什么
你的错误可能在你没有发布的代码中,这是为你的内存分配A。
或许你有超过1个构造函数而你没有在其中一个构造函数中分配内存。
答案 3 :(得分:0)
因为你是C ++,所以使用std :: vector而不是数组。然后问题就会消失。 有些东西:
#include <vector>
#include <string>
using std::string;
using std::vector;
struct A_type
{
string s1,s2,s3;
A_type(string str1,string str2, string str3): s1(str1), s2(str2), s3(str3) {};
};
class X
{
public:
X();
private:
vector<A_type> A;
};
X::X()
: A(vector<A_type>())
{
A.push_back(A_type("something","or","other"));
//...
// Access vector items by A[index] or better A.at(index)
}
更好的C ++恕我直言。
答案 4 :(得分:0)
问题是您使用的是malloc而不是new。 Malloc只分配原始字节,new为对象分配内存,并调用该对象的构造函数。基本上你留下了一个带有未初始化值的类/结构。在您的情况下,字符串尚未初始化,因此尝试使用它会导致seg错误。这就是你想要的:
#include <stdio.h>
#include <math.h>
#include <string>
#include <iostream>
using namespace std;
struct HMMStruct { string a; };
HMMStruct *HMMs;
int main() {
HMMs = new HMMStruct[2];
HMMs[0].a="sdfasasdsdfg";
cout << HMMs[0].a << endl;
delete [] HMMs; // don't forget to delete.
}