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; }
3 Réponses :
Vous n'avez pas alloué de place pour votre 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 et utilisez un correspondant Appelez à int code>, vous avez seulement déclaré un pointeur em> à un
int code>.
Malloc code>: p>
GRATUIT CODE> Pour libérer la mémoire ultérieurement: P>
int n;
n = 20;
Vous n'avez pas alloué la mémoire à tente d'écrire une mémoire non spécifiée. p> Essayez p> < Pré> xxx pré> p> n code>, donc
Vous essayez d'écrire < forte> Allocation dynamique: strong> p> ou sur la pile 20 code> à la valeur des ordures. Vous devez allouer de l'espace pour celui-ci en utilisant l'un des fonctions
* alloc () CODE> ou de créer un int sur la pile et d'obtenir l'annonce (comme Richard J. Ross III mentionné sur les commentaires).
Notez que malloc code> n'est pas la seule solution. Il y a
mmap code>,
alloca code> 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); code> ... hé, j'ai modifié des privilèges, alors je suis allé de l'avant et j'ai fait le changement.
'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 code> et passer
& n code> (l'adresse de n), sur toutes les fonctions ayant besoin
int * code > comme paramètre.