2010-08-07 10 views
1

J'écris un programme pour une structure de données « Set » en C.Structure problème d'initialisation en C

Cela fonctionne très bien quand une instance de Set est présent, mais il ne fonctionne pas lorsque deux instances de Set sont présents.

Aussi mon code pour supprimer un élément ne fonctionne pas lorsque le candidat est le premier élément.

Quelqu'un peut-il m'aider?

Voici le code:

+0

Est-ce un devoir? –

+2

Cette forme de question n'attire généralement pas beaucoup d'aide sur Stack Overflow. Si votre code est raisonnablement compact, vous pouvez l'insérer en ligne (regardez l'aide à la mise en forme dans la barre latérale sur la page d'édition!) Et vous obtiendrez probablement plus d'attention. Si votre code n'est pas compact, essayez d'afficher un sous-ensemble sélectionné ... mais vous aurez besoin d'avoir une théorie sur ce qui se passe pour y arriver. – dmckee

+0

Si vous êtes réellement, * vraiment * coincé, pensez à faire un pas à travers le code pour voir ce qui se passe (p.ex. obtenir un tableau blanc ou un gros morceau de papier, écrire des boîtes pour représenter la variable code à la fois ...). – dmckee

Répondre

5

d'abord tout ce que vous passes pointeur pour définir par valeur. C'est à dire. au lieu de

void Set_Create (Set* set) { 
    set = malloc(...); // Malloc here leads to memory-leak. 
    //... 
} 

int main() { 
    Set *set; // Some value like 0xdeadbeef pointing somewhere 
    Set_Create (set); 
    // set have still undefined value 
} 

utilisation

Set *Set_Create() { 
    Set *set = malloc(...); 
    /// ... 
    return set; 
} 

int main() { 
    Set *set; // Some value like 0xdeadbeef pointing somewhere 
    set = Set_Create(); 
    // set point to new memory 
} 

ou:

void Set_Create (Set *set) { 
    // No malloc 
    /// ... 
    return set; 
} 

int main() { 
    Set set; // Create on stack 
    Set_Create (&set); // Initialize 
    // ... 
} 

Je conseille de relire le chapitre sur les pointeurs (ne vous inquiétez pas - ils sont considérés comme difficiles, mais ils sont doivent pour les programmeurs C).

4

Je suppose que vous nous demandez de vous aider avec vos devoirs, donc je ne vais pas résoudre tous vos problèmes de code pour vous. Je vais seulement souligner votre erreur la plus flagrante, qui est l'erreur que vous avez posée - pourquoi le deuxième appel à votre fonction create_Set() échouer?

Test.c, lignes 27-28:

Set* s2; 
    Set_Create(s2); //.. Here error comes.. 

En set.c, j'ai coupé vers le bas au code significatif:

void Set_Create(Set* set){ 
    if(set == NULL){ 
     set = (Set *)malloc(sizeof(Set)); 
    } 

    set->size = 0; 
    set->data = -1; 
    set->next = NULL; 
} 

Ce qui se passe est que les deux de vos appels au Set_Create remplacent certains emplacements de mémoire arbitraires et imprévisibles. C'est un bug sérieux.

Dans le cas de set1, le pointeur arbitraire que vous avez rencontré semble pointer vers un endroit de la mémoire dans lequel vous pouvez écrire. Qui sait quelles données vous êtes en train de taper, mais vos données peuvent survivre à cet endroit pendant une courte durée.

Dans le cas de set2, le pointeur arbitraire que vous rencontrez est pas un emplacement de mémoire valide pour vous de modifier, de sorte que votre programme se bloque.

Changer votre create_Set comme ceci:

Set* Set_Create() { 
    Set * set = calloc(1, sizeof(Set)); 

    set->data = -1; 
    return set; 
} 

Et test.c:

Set * set1 = Set_Create();