7
votes

Défaut de segmentation lorsque vous essayez d'imprimer la valeur en C

Le code C suivant renvoie une erreur "erreur de segmentation". Je ne comprends pas pourquoi il ne renvoie pas la valeur 20. Quelle est mon erreur?

#include <stdio.h>

int main() 
{
    int* n;
    *n = 20;

    printf("%i\n",*n);

    return 0;

}


2 commentaires

'N' est une valeur de pointeur non initialisée que vous êtes la déséroférance dans la ligne '* N = 20'. Si vous souhaitez utiliser un pointeur, vous devez vous assurer que vous l'initialisez à pointer sur un emplacement de mémoire valide avant d'essayer de la désirer.


Alternativement aux réponses déjà données, vous pouvez simplement int n = 20 et passer & n (l'adresse de n), sur toutes les fonctions ayant besoin int * comme paramètre.


3 Réponses :


5
votes

Vous n'avez pas alloué de place pour votre int code>, vous avez seulement déclaré un pointeur em> à un int code>.

Le pointeur est ininitialisé, et donc écrire dans cet espace inconnu en mémoire est un comportement indéfini et provoque des problèmes. Cela provoque généralement un segfault. P>

Vous pouvez attribuer une fente pour un entier utilisant Malloc code>: p> xxx pré>

et utilisez un correspondant Appelez à GRATUIT CODE> Pour libérer la mémoire ultérieurement: P>

int n;
n = 20;


0 commentaires

16
votes

Vous n'avez pas alloué la mémoire à n , donc xxx

tente d'écrire une mémoire non spécifiée.

Essayez < Pré> xxx


0 commentaires

2
votes

Vous essayez d'écrire 20 à la valeur des ordures. Vous devez allouer de l'espace pour celui-ci en utilisant l'un des fonctions * alloc () ou de créer un int sur la pile et d'obtenir l'annonce (comme Richard J. Ross III mentionné sur les commentaires).

< forte> Allocation dynamique: xxx

ou sur la pile xxx


3 commentaires

Notez que malloc n'est pas la seule solution. Il y a mmap , alloca et simplement créer un int sur la pile et obtenir l'adresse.


@ Richardj.rossiii: merci. Mis à jour.


Votre exemple de pile n'est pas cohérent avec «Obtenir l'Andress of It». Ce que vous voulez, c'est int istetack; int n = & Ontetack; * n = 20; printf ("% i \ n", * n); ... hé, j'ai modifié des privilèges, alors je suis allé de l'avant et j'ai fait le changement.