分段故障查询

时间:2016-02-15 15:16:41

标签: c++ segmentation-fault

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;
}

3 个答案:

答案 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