-3
votes

Quelqu'un peut-il m'expliquer ce qui cause réellement cette faute de segmentation et comment surmonter cela?

Segmentation fault(core dumped)

4 commentaires

Dupliqué possible de Qu'est-ce qu'une défaillance de segmentation?


p est initialisé à un pointeur NULL (déguisé un peu par votre utilisation de macros). Évaluer * p a un comportement non défini. L'énoncé * p = val évalue les deux * p Pour obtenir une adresse et attribue cette adresse à la valeur de 2 , qui écrase la mémoire que Votre programme ne doit pas accéder. Le système hôte détecte cela et envoie un signal à votre programme, ce qui entraîne la terminaison du programme avec un message sur une défaillance de segmentation. Une solution possible - Créez un int et attribuer p l'adresse de cet ex. int i; p = & i; avant le premier printf ()


On ne sait pas ce que tu ne veux pas faire. Voulez-vous p pour pointer quelque part qui contient la valeur 2 ou souhaitez-vous forcer p pour contenir un entier, plutôt que d'être un pointeur?


@eddyCTID: Vous pouvez accepter l'une des réponses en cliquant sur la coche grise ci-dessous son score.


5 Réponses :


0
votes

Les pointeurs indiquent directement des adresses de mémoire. Alors que chaque programme que nous exécutons est attribué une zone de mémoire fixe uniquement (appelée segments). Toutes les adresses de mémoire dans cette zone sont mentionnées à l'aide de l'adresse de la mémoire relative.

Mais les pointeurs ont des adresses de mémoire absolues. Généralement, les adresses de mémoire de départ concernent l'utilisation du système d'exploitation. Lorsque vous attribuez un pointeur à une adresse à l'extérieur de sa zone de segment, il donne SIGSEGV (erreur de segmentation).

Dans votre cas également, vous essayez d'affecter une adresse à l'extérieur de sa zone de segment ainsi de l'erreur.


0 commentaires

1
votes

Null Pointer est une valeur réservée spéciale d'un pointeur. Un pointeur de tout type a une telle valeur réservée. Formellement, chaque type de pointeur spécifique (INT *, CHAR * etc.) a sa propre valeur dédiée NULL-POINTER. Conceptuellement, quand un pointeur a cette valeur nulle, il ne pointe nulle part.

Le pointeur vide est un type de pointeur spécifique - Void * - un pointeur qui pointe sur un emplacement de données dans le stockage, qui n'a pas de type spécifique.

ici NULL1 fait référence à un pointeur vide alors que p est un pointeur du type entier.

J'espère que j'avais raison et cela vous est utile.


0 commentaires

0
votes

Vous devez juste avoir besoin d'attribuer votre pointeur à votre macro sous forme de code ci-dessous:

#include <stdio.h>

#define val 2

int main()
{
    int *p;

    p = (int*)val;
    printf("%p\n", &p);
    printf("%d\n", p);

    return 0;
}


0 commentaires

0
votes

NULL POINTER est un pointeur non valide car il pointe de la mémoire qui n'est pas valide pour accéder afin que la déclaration * p = val n'est pas valide, l'erreur de défaut de segmentation apparaît.

Pour surmonter cette erreur, vous devez attribuer une adresse valide d'un emplacement de mémoire au pointeur (P), par exemple définissant une variable (var) et attribuer les addres au pointeur comme p = & var; .


2 commentaires

Compte tenu de la définition de val , p = & val; serait invalide aussi.


@chqrlie Je viens de remarquer que Val est macro pas variable. J'ai édité ma réponse. Merci :).



2
votes

null1 est un pointeur null, sa définition #define null1 ((vide *) 0) est l'une des définitions acceptées pour un pointeur NULL.

VAL est une macro en expansion à la constante entier ordinaire 2 . Casting 2 comme (int) n'a aucun effet, 2 est déjà un int valeur constante.

stocker une valeur à un pointeur NULL a un comportement indéfini. Un défaut de segmentation est l'un des effets possibles du comportement non défini. Un assez utile car il permet au débogueur de pointer le problème immédiatement.

Casting de toute autre valeur entière que (int *) a un comportement non défini aussi: p = (int *) val; * p = val; est très susceptible de causer la même défaut de segmentation, mais peut avoir d'autres effets secondaires inattendus, en fonction des spécifications de la plate-forme cible: si 2 se trouve être l'adresse de Le port de déclenchement d'autodestruction, tous les paris sont éteints.


0 commentaires