2010-02-16 5 views
0

Aidez-moi à résoudre 2 questions sur des pointeurs:Certains « prédire les sorties » avec des pointeurs

1) S'il vous plaît dites-moi pourquoi je reçois « erreur de segmentation » quand je lance suivant extrait

main() 
{ 
    char *str1 = "united"; 
    char *str2 ="front"; 
    char *str3; 
    str3 = strcat(str1,str2); 
    printf("\n%s",str3); 
} 

2) Pourquoi ne pas obtenir la sortie dans le code suivant:

main() 
{ 
    char str[10] = {0,0,0,0,0,0,0,0,0,0}; 
    char *s; 
    int i; 
    s = str; 
    for(i=0 ; i<=9;i++) 
    { 
     if(*s) 
      printf("%c",*s); 
     s++; 
    } 
} 

Merci.

+0

Merci beaucoup à tous :) – Supereme

Répondre

3
  1. Vous devriez examiner comment strcat œuvres. Il tentera de réécrire la mémoire à la fin de votre pointeur str1, puis de vous renvoyer le pointeur de destination. Le compilateur a alloué seulement assez de mémoire dans str1 pour contenir "united \ 0" (7 caractères), que vous essayez de remplir avec "unitedfront \ 0" (12 caractères). str1 pointe vers seulement 7 caractères alloués, il n'y a donc pas de place pour la concaténation.

  2. *s déréférencera s, en donnant effectivement le premier caractère dans le tableau. C'est 0, qui va évaluer à faux.

+2

De plus, pour la question 1, str1 pourraient pointer vers un segment de données constant qui ne permettra pas écrit du tout. – tomlogic

2

1) compile à quelque chose comme:

const char _str1[7] = "united"; 
const char _str2[6] ="front"; 
char *str1 = _str1; 
char *str2 = _str2; 
strcat(str1,str2); 
str3 = str1; 

points de STR1 à un tampon qui est exactement 7 octets de long et est rempli de 6 caractères. Le strcat a mis 5 octets supplémentaires dans ce tampon. 7 octets ne peuvent pas contenir 11 caractères. Le C il n'y a pas de magie! Si vous n'allouez pas explicitement de l'espace pour quelque chose, personne d'autre ne le fait non plus ...

2) ne va rien imprimer. Il parcourt un tableau dont chaque élément est 0. Il teste ensuite si l'élément actuel (*s) n'est pas 0 (if(*s)), et si c'est le cas, imprime cet élément sous forme de caractère. Cependant, comme l'élément est toujours 0, il échoue toujours à tester.

1

pour la question 2, pensez à ce que la ligne suivante fait:

if(*s) 
Questions connexes