C ++新手在这里。这可能是愚蠢的,但我在为类中的struct赋值时遇到分段错误。有什么指针吗?
#include <iostream>
#include<string>
using namespace std;
struct s { std::string s;};
class A {
public:
A(){}
~A(){}
struct s *ss[10];
};
int main(){
A a;
a.ss[0]->s = "test";
cout<<a.ss[0]->s<<endl;
return 0;
}
答案 0 :(得分:2)
未分配指针a.ss[0]
。
例如,您可以在类A
的构造函数中分配它,如下所示:
A(){ ss[0] = new s; }
我不确定您的代码的用途是什么。
P.S。:不要忘记在不再需要时删除已分配的内存。例如:
~A(){ delete ss[0]; }
或者,正如LogicStuff指出的那样,你可以重写指向常规数组的指针数组,如下所示:
struct s ss[10];
答案 1 :(得分:0)
struct s *ss[10];
此行声明的是指向struct s
,不 10个struct s
类型对象的10个指针数组。这10个指针无处可寻,为了使它们有用,你必须实际分配内存并创建这些对象(并在完成后清理它们)。
这是构造函数和析构函数派上用场的地方:
class A {
public:
A()
{
for(int i = 0; i < 10; ++i)
{
ss[i] = new s;
}
}
~A()
{
for(int i = 0; i < 10; ++i)
{
delete ss[i];
}
}
struct s *ss[10];
};
现在,数组中的每个指针都指向有效的struct s
个对象,因此您可以安全地访问它们:
A a;
a.ss[0]->s = "test";
答案 2 :(得分:0)
当你说
时/*struct*/ s *ss[10]; // P.S. you don't need "struct" here as in C
编译器理解它应该在类中保留10个指向s
类型对象的空间。但是,它不能确保那些指针指向任何有效的东西。
实际上,最安全的做法是完全避免使用原始数组并使用向量。你的生活会更容易。
struct A {
// note no need to declare default ctor and dtor here
std::vector<s> ss{10}; // initialize with 10 default-constructed strings
};
// then in main()
A a;
a.ss[0].s = "test";
s* p = &ss[0]; // if you need a pointer; fine so long as vector doesn't change