2010-11-02 14 views
1

Salut J'essaie de faire un programme avec pointeur dans une structure. Le compilateur ne présente aucun problème mais le programme se bloque. Pourriez-vous m'aider s'il vous plaît?Pointeur de structure? Quelque chose ne va pas

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 

int pos; 

typedef struct _Parking Parking; 

struct _Parking 
{ 
    int pos;  
    char name[15];  
    char description[80]; 
    float price;   
    int slots[5];  
    char last_driver_id;  
    int reservations; 
}; 

Parking *myaccounts; 

int create_Parking() 
{ 
    strcpy(myaccounts->name,"Pro"); 
    myaccounts->pos ++; 

    return pos-1;    
} 

int main() 
{ 

    int a; 

    a = create_Parking(); 

    printf("a=%d\n",a); 
    printf("name=%s\n",myaccounts->name); 

    system("pause");  
    return 0;  
} 
+0

Langue? Ajouter un tag –

+1

@ user494766: si vous étiez satisfait par une ou plusieurs des réponses (et vous devriez), vous devriez "accepter" celui que vous vous sentez le mieux. –

Répondre

8

pointeur Votre MyAccounts est initialisé à NULL (comme une variable globale) et n'a donc pas pointer vers la mémoire utilisable. Essayez la page de manuel de malloc pour plus d'informations.

Éditer: Incorporé le commentaire de Maciej.

+1

On dirait que 'myaccounts' est un global. Les globaux sont initialisés à zéro, n'est-ce pas? –

+0

@Maciej: Vous avez raison. Je vais mettre à jour le libellé de la réponse. –

+2

Un pointeur initialisé à zéro n'est pas un pointeur valide. De plus, zéro-initialisé ou non, je ne recommanderais pas d'utiliser une variable qui n'a pas été explicitement initialisée. –

6

Vous n'allouez jamais de mémoire pour "myaccounts".

0

Votre pointeur ne pointe à rien. Vous pouvez essayer l'un de ces:

Parking myaccountsInstance; 
Parking *myaccounts = &myaccountsInstance; 

ou dans la fonction principale:

Commencez par:

myaccounts = (Parking*)malloc(sizeof(Parking)); 

et se terminent par:

free(myaccounts); 
+0

Veuillez ne pas apprendre aux gens à ignorer la condition d'erreur pour 'malloc'. –

+0

Merci beaucoup pour vos réponses. Cela fonctionne maintenant parfait. – user494766

+0

La distribution de la valeur de retour de 'malloc' est réellement nuisible. Voir http://www.cpax.org.uk/prg/writings/casting.php pour plus d'informations sur pourquoi. –

3

Pointeurs en C do pas pointer vers la mémoire valide (et va planter si vous essayez de les utiliser), jusqu'à ce que vous les pointiez spécifiquement quelque part valide en utilisant t Il adresse l'opérateur sur un objet (&) ou en leur allouant de la mémoire et en attribuant cette adresse au pointeur (malloc() et amis). Bien sûr, si vous utilisez l'opérateur address-of, cet emplacement peut devenir invalide lorsque l'objet est hors de portée. Si vous utilisez malloc() cet emplacement peut devenir invalide lorsque free() est appelée. Dans les deux cas, votre pointeur redeviendra invalide. C est aussi énormément tributaire des pointeurs, donc vous pouvez compter sur n'importe quel code C que vous écrivez de n'importe quelle taille ayant un bug ou deux de cette nature jusqu'à ce que vous les traquiez et les corrigiez. Obtenir vos sources après le compilateur en C ne veut vraiment pas dire grand-chose. Si vous voulez écrire dans une langue où votre code est susceptible de fonctionner la première fois que vous l'exécutez après l'avoir dépassé le compilateur, vous voulez Ada.