Reputation: 349
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
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
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
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