Segmentation fault autour de strcpy?
Je sais que vous vous rap-moi sur les doigts mais.
Pourquoi faire la même erreur de Segmentation
char* cmd;
strcpy(cmd, argv[0]);
quand ce n'est pas
char *cmd;
cmd = "plop";
Je ne pratique pas depuis un moment, et ne me souviens pas pourquoi.
ps: en fait, je sais que quelque chose comme ça, avant de le strcpy, il serait préférable de
char *cmd = (char*) malloc(strlen(argv[0]));
mais je me demande pourquoi cette erreur de segmentation.
Merci !
double possible de Quel est le problème avec ce C (strcpy) code?
stackoverflow.com/questions/9677654/...
stackoverflow.com/questions/9677654/...
OriginalL'auteur roro | 2011-06-22
Vous devez vous connecter pour publier un commentaire.
Lorsque vous faites:
Vous êtes allouer un pointeur sur la pile. Ce pointeur n'est pas initialisé de toute valeur.
Puis, quand vous faites cela:
Vous copie la chaîne de caractères contenue dans
argv[0]
à l'adresse pointéecmd
, qui est... quelque chose dénuée de sens. Puisque vous avez de la chance, c'est tout simplement de segmentation.Quand vous faites cela:
Que vous attribuez à
cmd
l'adresse d'une chaîne statique constante. Depuis ces chaînes sont en lecture seule, écriture sur eux, c'est un comportement indéfini.Alors, comment résoudre ce problème? Allouer de la mémoire pour l'exécution d'écrire. Il y a deux façons:
La première consiste à répartir les données sur la pile, comme ceci:
Il alloue un tableau de 100
char
s sur la pile. Cependant, il n'est pas nécessairement robuste, parce que vous devez savoir à l'avance la quantité de mémoire dont vous aurez besoin. La pile est aussi plus petit que le tas. Ce qui nous amène à l'option numéro 2:Il alloue
whatever_you_need
char
s sur le tas. Ne pas oublier de libérer la mémoire avecfree
une fois que vous avez terminé avec elle.OriginalL'auteur Etienne de Martel
Vous obtenez un seg. faute, parce que
cmd
dans votre premier exemple n'est pas de pointage à rien (ou, plutôt, il pointe vers quelque chose d'indéfini - afin de tenter de lire les caractères à partir de ou écrire des caractères dans le pointeur probablement entraîner une violation d'accès).Dans le deuxième exemple, la configuration de cmd pour point de légitime d'une chaîne de caractères.
OriginalL'auteur Will A
Si vous voulez faire une copie de argv[0] facilement,
Bien sûr, vous avez mieux à vérifier le résultat de strdup est null ou pas. 🙂
OriginalL'auteur mattn
Parce que si
cmd
est une variable globale, sa valeur estNULL
, ce qui n'est pas accessible en écriture, et si c'est une variable locale, alors sa valeur est indéterminée et vous ne devriez pas l'utiliser (mais il peut faire quelque chose si vous le faites, ce qui est pire que NUL, dans de nombreux cas).OriginalL'auteur Pascal Cuoq