Meehatpa
Meehatpa

Reputation: 349

Segmentation Fault query

C++ newbie here. This may be stupid but I am getting segmentation fault while assigning value to struct in a class. Any pointers?

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

Upvotes: 0

Views: 104

Answers (3)

Yam Marcovic
Yam Marcovic

Reputation: 8141

When you say

/*struct*/ s *ss[10]; // P.S. you don't need "struct" here as in C

the compiler understands that it should reserve space in your class for 10 pointers to objects of type s. It doesn't make sure that those pointers point to anything valid, though.

Actually, the safest thing would be to avoid raw arrays entirely and use a vector. Your life will be much easier.

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

Upvotes: 0

Michiel Pater
Michiel Pater

Reputation: 23023

The pointer a.ss[0] is not allocated.

You could for example allocate it in the constructor of class A, like this:

A(){ ss[0] = new s; }

I'm not sure what the purpose of your code is.

P.S.: Don't forget to delete the allocated memory once it is not needed anymore. For example:

~A(){ delete ss[0]; }

Alternatively, as LogicStuff pointed out, you can rewrite the array of pointers to a regular array, like this:

struct s ss[10];

Upvotes: 2

Ionut
Ionut

Reputation: 6866

struct s *ss[10];

What this line declares is an array of 10 pointers to struct s, not 10 objects of type struct s. Those 10 pointers point nowhere, to make them useful you have to actually allocate memory for and create those object (and clean them up when you're done). This is where constructors and destructors come in handy:

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

Now each of those 10 pointers in your array point to valid struct s objects, so you can safely access them:

A a;
a.ss[0]->s = "test";

Upvotes: 0

Related Questions