2013-07-12 3 views
1

J'expérimente avec Struct, pointeurs et typedef dans le code ci-dessous. Je veux créer un pointeur vers une structure que j'ai créée. Ensuite, je veux manipuler les membres de la structure en utilisant l'opérateur ->.Struct et pointeurs C++

Le code ci-dessous compile bien, cependant, quand je lance le programme, il produit une erreur de segmentation.

Quelqu'un peut-il s'il vous plaît expliquer où ma logique a mal tourné?

Merci.

struct Structure1 { 
char c; 
int i; 
float f; 
double d; 
}; 

typedef Structure1* structp; 

int main(){ 
structp s1, s2; 
s1->c = 'a'; 
s1->i = 1; 
s1->f = 3.14; 
s1->d = 0.00093; 
s2->c = 'a'; 
s2->i = 1; 
s2->f = 3.14; 
s2->d = 0.00093; 
} 

Répondre

4
structp s1, s2; 

Vous avez déclaré deux pointeurs, s1 et s2 mais ils ne pointent nulle part encore! Vous devez allouer de la mémoire pour ces pointeurs en utilisant new.

s1 = new Structure1(); 
s1->c = 'a'; 
s1->i = 1; 
// ... 

Ne pas oublier de supprimer la mémoire après:

delete s1; 

Voir this answer pourquoi les parenthèses dans new Structure1() font une différence. Notez également qu'il existe d'autres façons d'obtenir un pointeur sur un objet, par exemple en utilisant l'opérateur &, mais dans ce cas particulier, je pense que vous souhaitez allouer de la mémoire.

+0

Génial !!!! merci beaucoup: D – SeekingAlpha

+2

Notez que l'opérateur 'new' n'est pas le seul moyen d'obtenir une adresse d'un objet valide. Vous pouvez également appliquer l'opérateur '&' à un objet existant du type correct. Ou, dans le cas de "données anciennes", placez un pointeur sur une région de mémoire suffisamment grande. –

2

pointeurs sont des objets en mémoire qui pointent vers un autre objet. Lorsque vous utilisez l'opérateur d'adressage , le pointeur est déréférencé. Par exemple, ceci:

s1->c; 

est le même que:

(*s1).c; 

Lorsque vous déréférencer un pointeur, il renvoie une référence à l'objet qu'il pointe. S'il n'y a aucun objet vers lequel pointe (ou indique nullptr), le déférencer donne à votre programme Undefined Behavior.

La solution serait de créer une nouvelle instance d'une classe sur le tas et de lui renvoyer un pointeur. C'est ce que new fait:

Structure1 *structp = new Structure1(); 

Il est logique une fois que vous réalisez que les pointeurs ne sont pas les objets réels, ils sont tout simplement des adresses mémoire. Si vous n'allouez pas d'espace ou si vous ne lui attribuez pas d'adresse mémoire, il restera non initialisé et rempli d'ordures. Tout comme un objet régulier, pourquoi voudriez-vous utiliser un pointeur initialisé?