Segmentation fault(core dumped)
5 Réponses :
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. P>
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). p>
Dans votre cas également, vous essayez d'affecter une adresse à l'extérieur de sa zone de segment ainsi de l'erreur. P>
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. P>
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. P>
ici NULL1 fait référence à un pointeur vide alors que p est un pointeur du type entier. p>
J'espère que j'avais raison et cela vous est utile. p>
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; }
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 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 = val code> n'est pas valide, l'erreur de défaut de segmentation apparaît. P>
p = & var; code>. p>
Compte tenu de la définition de val code>,
p = & val; code> serait invalide aussi.
@chqrlie Je viens de remarquer que Val est macro pas variable. J'ai édité ma réponse. Merci :).
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. P>
Casting de toute autre valeur entière que null1 code> est un pointeur null, sa définition
#define null1 ((vide *) 0) code> est l'une des définitions acceptées pour un pointeur NULL. P>
VAL code> est une macro en expansion à la constante entier ordinaire
2 code>. Casting
2 code> comme
(int) code> n'a aucun effet,
2 code> est déjà un
int code> valeur constante. P>
(int *) code> a un comportement non défini aussi:
p = (int *) val; * p = val; code> 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 code> se trouve être l'adresse de Le port de déclenchement d'autodestruction, tous les paris sont éteints. P>
Dupliqué possible de Qu'est-ce qu'une défaillance de segmentation?
p code> est initialisé à un pointeur NULL (déguisé un peu par votre utilisation de macros). Évaluer
* p code> a un comportement non défini. L'énoncé
* p = val code> évalue les deux
* p code> Pour obtenir une adresse et attribue cette adresse à la valeur de
2 code>, 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 code> et attribuer
p code> l'adresse de cet ex.
int i; p = & i; code> avant le premier
printf () code>
On ne sait pas ce que tu ne veux pas faire. Voulez-vous
p code> pour pointer quelque part qui contient la valeur
2 code> ou souhaitez-vous forcer
p code> 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.