Directement de l'attribution des valeurs de C les Pointeurs
J'ai juste commencé à apprendre le C et j'ai été en cours d'exécution de certains programmes simples en utilisant MinGW pour Windows afin de comprendre comment les pointeurs de travail. J'ai essayé le suivant:
#include <stdio.h>
int main(){
int *ptr;
*ptr = 20;
printf("%d", *ptr);
return 0;
}
qui a compilé correctement mais quand je lance l'exécutable ne fonctionne pas - la valeur n'est pas imprimé à la ligne de commande, je reçois un message d'erreur qui dit que le .fichier exe a cessé de fonctionner.
Cependant, quand j'ai essayé de stocker la valeur dans une variable int et affecter *ptr à l'adresse mémoire de la variable, comme indiqué ci-dessous:
#include <stdio.h>
int main(){
int *ptr;
int q = 50;
ptr = &q;
printf("%d", *ptr);
return 0;
}
il fonctionne très bien.
Ma question est, pourquoi suis-je incapable de régler directement une valeur littérale du pointeur? J'ai regardé des tutoriels en ligne pour les pointeurs et la plupart d'entre eux de la même manière que le deuxième exemple.
Toute aide est appréciée.
Tu as de la chance qu'il termine par une erreur.
est droit. Dans le code réel, ce genre de bug tend à conduire à une semaine de sessions de débogage à essayer de comprendre pourquoi une autre variable change de manière aléatoire à chaque fois dans un certain temps (jamais quand vous êtes en fait de tests de dépistage pour elle, toujours, quand vous êtes en train de faire une démonstration publique) ou des failles de sécurité où quelqu'un met la "is_admin" drapeau de vrai en manipulant des valeurs différentes.
Le titre de cette question, "Directement de l'attribution des valeurs de Pointeurs C" est un peu trompeur. Tout le problème est que vous ne pas affecter une valeur à l'aide du pointeur.
OriginalL'auteur Shreya Srinivas | 2013-07-15
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous n'êtes pas à l'initialisation du pointeur. Vous avez créé un pointeur vers n'importe où vous voulez"—qui pourrait être l'adresse d'une autre variable, ou au moyen de votre code, ou de la mémoire qui n'est pas mappé à tous.
Vous avez besoin pour créer un
int
variable quelque part dans la mémoire de laint *
variable à point.Votre deuxième exemple fait cela, mais il fait d'autres choses qui ne sont pas pertinentes ici. Voici la chose la plus simple que vous devez faire:
Ici, le
int
variable n'est pas initialisée, mais c'est très bien, parce que vous êtes juste de remplacer n'importe quelle valeur était là avec20
. L'essentiel est que le pointeur est initialisé à point pour lavariable
. En fait, vous avez juste à allouer de la mémoire brute, si vous le souhaitez:OriginalL'auteur abarnert
Premier Programme avec des commentaires
Deuxième Programme avec des commentaires
La clé est que vous ne pouvez pas utiliser un pointeur jusqu'à ce que vous savez, il est affecté à une adresse que vous avez vous-même gérés, soit en la pointant vers une autre variable que vous avez créé ou à la suite d'un appel de malloc.
De l'utiliser avant est de créer du code qui dépend de la mémoire non initialisée qui permet au mieux de planter, mais au pire des travaux parfois, parce que le hasard l'adresse de mémoire qui se passe à l'intérieur de l'espace mémoire de votre programme est déjà propriétaire. Dieu vous aide si elle remplace une structure de données que vous utilisez ailleurs dans votre programme.
OriginalL'auteur JonnyRo
Dans le premier exemple, le ptr n'a pas été initialisé, de sorte qu'il pointe vers un quelconque emplacement de mémoire. Lorsque vous affectez quelque chose à ce quelconque de l'emplacement, de votre programme de coups.
Dans le deuxième exemple, l'adresse est quand vous dites ptr = &q, de sorte que vous êtes OK.
OriginalL'auteur jsp