C: erreur de Segmentation lors de l'utilisation de printf
Celui-ci est probablement très simple, mais je n'arrive pas à le faire fonctionner.
J'ai ce bout de code:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[100];
char *p = buf;
strcpy(p, "Test string");
printf("%s\n", *p);
}
Ce qui provoque une erreur de segmentation quand je le lance. GDB sorties:
Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6
Mais je ne comprends toujours pas.
Commentaire serait apprécié, merci.
Vous pourriez avoir regardé la GCC avertissement pour avoir une idée du problème: test.c:In function ‘main’: test.c:12: avertissement: format ‘%s’ attend de type ‘char *’, mais l'argument 2 est de type "int"
C'est marrant, je n'ai pas de message d'avertissement, si je le faisais, j'aurais probablement pu sauvé tout le monde un certain temps, y compris moi-même 🙂
Vous pouvez vous assurer d'utiliser la
C'est marrant, je n'ai pas de message d'avertissement, si je le faisais, j'aurais probablement pu sauvé tout le monde un certain temps, y compris moi-même 🙂
Vous pouvez vous assurer d'utiliser la
-Wall
compilateur drapeau à faire assurez-vous de ne pas manquer les mises en garde.OriginalL'auteur Hamza | 2010-06-04
Vous devez vous connecter pour publier un commentaire.
Lorsque vous écrivez
la
*p
sera la valeur àp[0]
qui est un caractère. Le printf cependant, est à la recherche d'un tableau de caractères, donc entraînant erreur de segmentation. Rappelez-vous qu'en C, les chaînes sont juste des tableaux de caractères et les tableaux sont effectivement des pointeurs vers le premier élément, c'est pourquoi vous n'avez pas besoin de déréférencement.Pour résoudre ce supprimer le * pour l'obtenir:
OriginalL'auteur Il-Bhima
Vous êtes en passant d'un personnage à printf; vous devriez être en passant le pointeur.
+1 Pour être le premier à répondre
Lorsque vous passez
*p
, vous êtes en passant un seul personnage en valeur. Lorsque vous passezp
, vous êtes en passant un pointeur sur le premier caractère de la chaîne, de sorte printf pourrez accéder au reste de la chaîne.Je comprends maintenant, grâce zildjohn01.
OriginalL'auteur zildjohn01
Utiliser ceci:
utiliser "p" au lieu de "*p"
OriginalL'auteur Ehsan
Remplacer
avec
Lorsque vous utilisez
%s
, printf vous attend pour passer unchar*
. Vous êtes de passage à unchar
à la place.seulement si vous voulez imprimer un caractère unique. Si vous voulez imprimer l'ensemble de la chaîne, vous avez besoin de passer le pointeur de façon à ce que printf peuvent y accéder. Sinon tout ce qu'il a est le personnage que vous avez passé (et de ne pas le reste de la chaîne). Qui font plus de sens?
C'était l'explication que je cherchais, merci beaucoup! C'est fascinant de voir comment il est facile d'oublier les principes après avoir travaillé avec un haut niveau de langues pour un moment 🙂
Votre ligne de travail et d'imprimer un char, si vous utilisez printf("%c\n", *p)
OriginalL'auteur Eric Petroelje
juste de passer la chaîne(le pointeur):
Si vous souhaitez imprimer le premier char, puis:
OriginalL'auteur AraK
%s causes printf() de déréférencement *p. Supposons que la chaîne a été "chaîne de Test".
Puis sur mon Solaris sparc boîte: (dans un programme de test) p serait "visant à" l'adresse 0x54657374. La probabilité de cette adresse le cadre de votre espace de processus est proche de zéro.
Qu'est ce qui a causé le signal SIGSEGV (erreur de segmentation).
OriginalL'auteur jim mcnamara