2009-11-23 4 views
1

Je suis un débutant C, et je suis curieux de savoir pourquoi cela me donne un à chaque fois défaut Seg:problème struct C

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

struct Wrapper { 
    int value; 
}; 

int main() { 
    struct Wrapper *test; 
    test->value = 5; 

    return 0; 
} 

Je sais que je ne comprends pas encore complètement pointeurs, mais je pense que

struct_ptr->field 

est le même que

(*struct_ptr).field 

afin d'essayer de faire une mission devrait être ok droit sur le terrain. Cela fonctionne comme prévu:

struct Wrapper test; 
test.value = 5; 

mais je suis curieux de savoir pourquoi l'utilisation du pointeur provoque une erreur Seg.

Je suis sur Ubuntu 9.04 (i486-linux-gnu), la version gcc 4.4.1

Répondre

12

Vous n'avez pas affecté le pointeur sur quoi que ce soit. C'est un pointeur non initialisé pointant vers qui sait quoi, donc les résultats ne sont pas définis.

Vous pouvez attribuer le pointeur à une instance créée dynamiquement, comme ceci:

int main() { 
    struct Wrapper *test; 
    test = (struct Wrapper *) malloc(sizeof(struct Wrapper)); 
    test->value = 5; 
    free(test); 

    return 0; 
} 

EDIT: C était pris conscience, pas C++. Exemple de code fixe en conséquence.

+0

ah oui, je savais que ce serait une chose stupide qui me manquait ... merci! –

+0

Vous pouvez également écrire: sizeof * test au lieu de sizeof (struct Wrapper). –

1

Vous devez créer une instance de Wrapper première:

struct Wrapper *test; 
test = new struct Wrapper; 
test->Value = 5; 

Bonne chance.

1

Vous utilisez un pointeur non initialisé, d'où le segfault. la capture de ce type d'erreur est possible, si vous activez des avertissements plus, en utilisant par exemple -Wall

Vous devez utiliser -Wall dans une certaine optimisation conjonction (-Sur) pour l'avertissement apparaisse. Par exemple, la compilation de votre code avec

gcc -Wall -O2 -c test.c 

a donné lieu dans le message d'erreur suivant:

test.c: Dans la fonction «main» : 
test.c:10: attention : «test» is used uninitialized in this function 

Tout en utilisant le mot français, ce message du compilateur est pas une insulte, mais un avertissement;) Voir ci-dessous code allouer de la mémoire pour votre pointeur de test

int main() { 
    struct Wrapper *test; 
    test = malloc(sizeof(struct Wrapper)) 
    if(test == NULL) { 
    /* error handling */ 
    } 
    test->value = 5; 
    free(test) 

    return 0; 
}