2012-10-18 2 views
4

Je dois identifier une structure globale (tableau), composée de 4 entiers. Le problème est que la taille de ce tableau struct n'est pas connue à l'avance.définir un pointeur struct struct dans C?

J'essaie de faire sth. comme ceci:

typedef struct 
{ 
    int value; 
    int MAXleft; 
    int MAXright; 
    int MAX; 
} strnum; 

int main() 
{ 
    int size; 
    scanf("%d", &size); 

    strnum numbers[size]; 

    return 0; 
} 

J'ai entendu cela, il est possible de le faire par des pointeurs mais je ne sais pas comment faire.

Répondre

5

Vous pouvez allouer l'espace pour plusieurs structures dynamiques comme celui-ci:

strnum *numbers = malloc(size * sizeof(strnum)); 

Ensuite, vous pouvez l'utiliser comme tout réseau régulier (la plupart du temps). Il peut être plus pratique d'utiliser calloc au lieu de malloc. Il alloue un certain nombre de blocs et les remplit de zéros. Veuillez noter que malloc ne supprime pas la mémoire allouée.

strnum *numbers = calloc(size, sizeof(strnum)); 

Lorsque vous avez terminé avec la mémoire de ne pas oublier d'appeler free(numbers), qui renverra le dos la mémoire allouée à un gestionnaire de mémoire.

Si vous n'avez plus besoin de free et que vous en allouez de plus en plus, l'empreinte mémoire du programme augmentera sans raison valable lorsque le programme continuera à fonctionner. C'est ce qu'on appelle une fuite de mémoire et devrait être évitée. Il pourrait éventuellement entraîner le manque de mémoire pour un programme et des résultats imprévisibles.

Et n'oubliez pas d'inclure un en-tête stdlib.h avec des prototypes de fonctions d'allocation de mémoire.

0

Il est appelé Dynamic Memory Allocation

La chose que vous essayez de faire peut se faire comme suit:

strnum* number; 
    int size = 0; 

    scanf("%d",&size); 

    number = malloc(size * sizeof(strnum)); 

En outre, ne pas oublier de libérer la mémoire une fois que vous avez fait à l'aide du tableau.

free(number); 
+0

en C vous ne lancez pas ce que malloc renvoie, il peut être émis si vous oubliez d'inclure stdlib.h puisque par défaut le type de retour s'il n'y a pas de prototype est int. En ne coulant pas, vous attraperiez cela. –

+0

Je ne pense pas que la conversion de 'malloc' fasse une différence si vous allouez la bonne quantité de mémoire. – sgarizvi

+3

Si quelqu'un écrit un programme avec un résultat de malloc sur un PC 32 bits et essaie de le compiler et de le lancer sur une machine avec un système 64 bits avec des pointeurs de 8 octets et des octets de 4 octets, il pourrait avoir un moment vraiment difficile à essayer de comprendre pourquoi ce dernier ne fonctionne pas. Le problème est que sans un prototype une valeur de retour sera tronquée à un int de 4 octets et causera très probablement une erreur de segmentation! –

0

Vous pouvez commencer par malloc(), puis faire realloc() lorsque la taille continue d'augmenter. Je vous suggère d'allouer un pool de 10 structures à la fois afin que le nombre d'appels à realloc() soit réduit.