2009-06-26 6 views
2
#include<stdio.h> 
#include<conio.h> 

void print(char *arr); 

void main() 
{ 
    clrscr(); 

    char temp='r'; 
    print(&temp); 
    getch(); 
} 

void print(char *arr) 
{ 
    int arrsz=sizeof(arr); 
    printf("size is %d",sizeof(arr)); 
    printf("char is %c",arr); 
} 

Pourquoi ai-je cette sortie?Veuillez expliquer cette sortie étrange

size is 1 
char is e 

Sûrement il devrait dire char is r?

+1

Et qu'attendez-vous? –

+2

-1: Quelle est votre question? – hillu

+0

Aussi, s'il vous plaît ne postez pas de questions avec des séries concaténées de! –

Répondre

13

Vous imprimez l'adresse pas l'utilisation de la valeur

printf("char is %c",*arr); 

Essayez d'exécuter ce via un débogueur pour comprendre ce qui se passe, et s'il vous plaît demander une vraie question, comme ce que pensez-vous devrait se produire, et ce que vous observez au lieu. En faisant cela, vous allez probablement répondre à la plupart de vos questions. Par ailleurs, une fois à l'impression, arr est une variable locale, et sizeof comme aucun moyen de connaître la taille du tableau d'origine, il devrait donc imprimer taille est 4. Le code ci-dessous montre ce comportement, et une différence entre tableau et pointeurs quand il s'agit de sizeof. Si vous essayez

EDIT: changé code pour quelque chose que j'ai testé, plutôt que juste deviné, grâce au commentaire de Daniel

#include <stdio.h> 

void print(char *); 

int main(int argc, char ** argv) 
{ 
    char temp = 'r'; 
    char temp2[] = {'a','b'}; 
    char temp3[] = {'r'}; 

    print(&temp); 
    print(temp2); 
    print(temp3); 

    printf("sizeof temp is %d\n",sizeof(&temp)); 
    printf("sizeof temp2 is %d\n", sizeof(temp2)); 
    printf("sizeof temp3 is %d\n",sizeof(temp3)); 
    return 0; 
} 

void print(char * arr) 
{ 
    printf("size of arr is %d\n", sizeof(arr)); 
    printf("arr contains %c\n", *arr); 
} 

Vous obtenez:

size of arr is 4 
arr contains r 
size of arr is 4 
arr contains a 
size of arr is 4 
arr contains r 
sizeof temp is 4 
sizeof temp2 is 2 
sizeof temp3 is 1 
+0

+1 bonne réponse –

+1

Oui, bonne réponse. Pour élaborer, @Chan, il est toujours bon de faire des types identiques donc si vous avez d'abord un char appelé temp, vous le passez comme & temp de sorte que vous avez maintenant un char *, vous vérifiez la signature de la fonction, super, c'est aussi un char *, alors vous imprimez la valeur d'un char, donc si vous voulez le rendre plus clair, faites simplement char_car_a_char = * arr; et vous avez encore un char. Il est toujours bon de "suivre" un type de variable lorsque vous consultez votre code. –

+3

sizeof (arr) dépend de l'architecture, mais généralement 4 (taille du pointeur). pas vraiment sûr comment CHAN a obtenu la sortie de '1', est-ce que certains compilateurs surchargent sizeof() pour quelque chose de similaire à strlen() pour char *? –

1

Vous essayez d'utiliser à la fois une chaîne et un caractère (et votre chaîne n'est pas nul J'ai terminé). Pour l'utiliser comme une chaîne, vous changer le code comme ceci:

//char temp='r'; 
char* temp = "r"; 

... 

//printf("char is %c",arr); 
printf("char is %s",arr); 

Pour l'utiliser comme un char, vous changeriez votre déclaration d'impression comme ceci:

printf("char is %c", arr[0]); 
2

Vous avez obtenu taille égale 1 parce que sizeof (arr) retourne la taille de ce que arr pointe vers, un caractère, qui est la taille 1.

Vous avez 'e' parce que printf a reçu un char * au lieu d'un caractère lorsque le drapeau% c a été donné. Changez-le en printf ("Char est:% c", * arr).

Si vous voulez utiliser un caractère *, vous devez utiliser le drapeau% s dans printf. Mais aussi, assurez-vous de mettre fin à tout ce que vous passez printf ou vous obtiendrez des déchets.

+0

Votre explication du résultat '1' est incorrecte. À l'intérieur de la fonction, 'arr' est un pointeur de caractère (pas un tableau) et retournerait le même que tout autre pointeur (qui est normalement 4 ou 8, pas 1). –

+0

Je me demandais pourquoi il n'est pas retourné 4 en fait. La seule raison pour laquelle j'ai mis cette explication était parce que l'affiche originale a dit que c'était ses résultats ... – samoz

2

Hm, quelque chose ne va pas ici. Je ne crois pas à cette sortie.

  • arr est un char * et sizeof(char *) != 1.
  • Il n'y a pas '\n' dans votre printf s.

Si vous avez tapé votre code à la main, ne le faites pas. Le copier-coller est bien meilleur, donc nous pouvons être sûrs que vous n'avez pas fait de fautes de frappe. Comme il est écrit que vous devez avoir obtenu quelque chose comme

size is 4char is 0

(Le « char est » une partie pourrait imprimer un caractère aléatoire.

+0

Le 1 m'a aussi intrigué. Je crois que sur Crays, à un moment donné, CHAR_BITS était de 32, donc sizeof (char) == sizeof (court) == sizeof (int) == 1. Mais ce n'est probablement pas la plate-forme ici; et void main() crie Windows. –

+0

Cette taille de donner 1 est déroutante. Si je mets la temp comme données globales, je reçois toujours 4 dans la sortie de print(). J'ai vu un comportement étrange de sizeof, mais c'était sur des plates-formes étranges :) – shodanex

Questions connexes