Question

J'ai une fonction dans laquelle l'un des arguments de la fonction est un entier. Au cours de l'appel de la fonction, je passe un type de données énuméré à cette fonction. Après avoir construit avec gcc, tout accès à la variable INTEGER dans la fonction provoque une erreur de segmentation.

Exemple de code:

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
    }
}

enum {

    UNDEFINED = -1,
    STATE_NICE,
    STATE_GREEDY
} E_STATE;

int main (int argc, char *argv [])
{
    somefun (STATE_NICE);
}
Était-ce utile?

La solution 5

D'après toutes vos réponses, il semble que le code soit logiquement correct et que je dois examiner la vraie raison de l'incident. Je vais enquêter et le poster bientôt.

Autres conseils

Tout d’abord, l’énumération est définie dans main () et n’existe pas pour somefun (). Vous devez définir l’enum en dehors de main, bien que je ne voie pas en quoi cela provoque un crash.

Après avoir défini l'énumération en dehors de la propriété principale, définissez un utilisateur sur un utilisateur (E_STATE nState) et effectuez un nouveau test.

J'ai compilé et exécuté ce code exactement (couper & et coller) sur mon ordinateur, à l'aide de la version 4.2.4 de gcc, sans erreur de segmentation, ni d'erreur. Je pense que le problème pourrait être ailleurs.

fonctionne réellement pour moi:

bash $ cat bar.c
#include <stdio.h>

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
      default:
        printf("Hello?\n");
    }
}

int main (int argc, char *argv [])
{
    enum {

        UNDEFINED = -1,
        STATE_NICE,
        STATE_GREEDY
    } E_STATE;

    somefun (STATE_NICE);
    return 0;
}
bash $ gcc -Wall bar.c -o bar
bar.c: In function 'main':
bar.c:22: warning: unused variable 'E_STATE'
bash $ ./bar
Hello?
bash $ 

Quelques modifications ont été apportées, mais elles ont fonctionné sans elles. (1) a ajouté une étiquette dans le commutateur juste pour qu'il y ait quelque chose; (2) ajouté les #include <stdio.h> et printf pour que je puisse dire qu’il s’était exécuté; (3) a ajouté le return 0; pour éliminer un avertissement inintéressant.

Il a été exécuté avec succès sans modification, il n'a rien fait de visible.

Alors, quel est le système d'exploitation, quelle est l'architecture matérielle?

Mettre à jour

Le code a changé pendant que je l'essayais. Voici donc un test de la version mise à jour:

bash $ cat bar-prime.c
#include <stdio.h>

void somefun (unsigned int nState)
{
    switch (nState) // <-- Crashes on this line
    {
        //
        // functionality here ...
        //
      default:
        printf("Hello?\n");
    }
}

enum {

    UNDEFINED = -1,
    STATE_NICE,
    STATE_GREEDY
} E_STATE;


int main (int argc, char *argv [])
{

    somefun (STATE_NICE);
    return 0;
}
bash $ gcc -Wall bar-prime.c -o bar-prime && ./bar-prime
Hello?
bash $ 

fonctionne toujours. Obtenez-vous un fichier de base dans votre version? Avez-vous essayé d'obtenir une trace de pile?

Votre situation est spécifique au matériel Sun Sparc ou similaire. Veuillez poster uname -a et la sortie de dmesg

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top