2010-10-27 17 views
2

Une structure comme celle-ci fonctionne très bien, je peux utiliser t après avoir appelé malloc (sizeof (mystruct)):Comment malloc "MyDef ** t" à une longueur spécifique, au lieu de "MyDef * t [5]" en C

struct mystruct { 
MyDef *t[5]; 
}; 

Je veux être en mesure de définir dynamiquement la longueur du réseau de MyDef, comme ce qui suit:

struct mystruct { 
MyDef **t; 
int size; 
}; 

Que dois-je faire en plus t o malloc (sizeof (mystruct)) pour que cela fonctionne, donc je peux faire TestStruct-> t [3] = quelque chose? Juste obtenir une erreur de segmentation!

Merci!

EDIT avec le code qui provoque la faute de SEG, à moins que je suis aveugle cela semble être ce que les réponses sont à ce jour:

#include <stdio.h> 
typedef struct mydef { 
int t; 
int y; 
int k; 
} MyDef; 

typedef struct mystruct { 

MyDef **t; 
int size; 

} MyStruct; 

int main(){ 
MyStruct *m; 

if (m = (MyStruct *)malloc(sizeof(MyStruct)) == NULL) 

    return 0; 

m->size = 11; //seg fault 

if (m->t = malloc(m->size * sizeof(*m->t)) == NULL) 

    return 0; 

return 0; 
} 

Répondre

0

m = (MyStruct *) malloc (sizeof (MyStruct)) == NULL

Qu'est-ce que cela fait. Appelle malloc, compare le retour de malloc à NULL. Assigne ensuite le résultat de cette comparaison (une valeur booléenne) à m. La raison en est que '==' a une priorité supérieure à '='.

ce que vous voulez:

if ((m = (MyStruct *)malloc(sizeof(MyStruct))) == NULL) 
... 
if ((m->t = malloc(m->size * sizeof(*m->t))) == NULL) 
+0

Merci. Oui, c'est ce que j'ai eu, va éditer la question avec la ligne que j'ai - c'est-à-dire - provoquant une erreur de segmentation. –

+0

@John - D'accord, assurez-vous de montrer le code réel, pas un code similaire hypothétique. –

+0

Édité avec le code réel –

1
struct mystruct *s = malloc(sizeof(*s)); 
s->size = 5; 
s->t = malloc(sizeof(*s->t) * s->size); 
+0

Ok, édité la question avec un exemple de code, qui semble faire exactement ce que toutes les réponses suggèrent - obtenir une erreur seg sur la ligne "if (m-> t = malloc (m-> size * sizeof (* m- > t)) == NULL) " –

+0

En fait, semble la faute seg est la ligne de réglage de la taille - selon gdb –

+0

première ligne devrait être struct mystruct * s = malloc (sizeof (s)); sinon, il alloue UNIQUEMENT l'espace nécessaire pour un pointeur (vous avez écrit sizeof (* s)) –

0

Cela se produit parce que vous n'allouez pas de mémoire pour lui-même tableau, seulement pour pointeur sur ce tableau.

Donc, vous devez d'abord affecter mystruct:

struct_instance = malloc(sizeof(mystruct)); 

et vous devez allouer de la mémoire pour le tableau de pointeurs vers MyDef et initialiser le pointeur dans votre struct

struct_instance->size = 123; 
struct_instance->t = malloc(sizeof(MyDef*) * struct_instance->size); 
+0

Merci à tous, je suis sûr que c'est ce que j'avais déjà essayé, je vais vérifier –