2 votes

Veuillez expliquer ce résultat étrange

#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 est-ce que j'obtiens ce résultat ?

size is 1
char is e

Il devrait certainement dire char is r ?

13voto

shodanex Points 7318

Vous imprimez l'adresse et non la valeur.

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

Essayez d'utiliser un débogueur pour comprendre ce qui se passe, et posez une vraie question, par exemple ce que vous pensez qu'il devrait se passer et ce que vous observez à la place. En faisant cela, vous répondrez probablement à la plupart de vos questions.

D'ailleurs, une fois dans print, arr est une variable locale, et sizeof n'a aucun moyen de connaître la taille du tableau original, donc il devrait afficher size is 4. Le code ci-dessous montre ce comportement, et une différence entre les tableaux et les pointeurs quand il s'agit de sizeof. Si vous essayez

EDIT : j'ai changé le code pour quelque chose que j'ai réellement 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

2voto

samoz Points 14652

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

Vous avez obtenu 'e' parce que printf a reçu un char* au lieu d'un char lorsque le drapeau %c a été donné. Remplacez-la par printf("Char is : %c", *arr).

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

2voto

John Kugelman Points 108754

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

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

Si vous avez tapé votre code à la main, ne le faites pas. Un copier-coller est de loin préférable afin que nous puissions être sûrs que vous n'avez pas fait de fautes de frappe. Tel qu'il est écrit, vous auriez dû obtenir quelque chose comme

size is 4char is 0

(La partie "char is" pourrait imprimer n'importe quel caractère aléatoire).

1voto

Eric Petroelje Points 40734

Vous essayez d'utiliser ceci à la fois comme une chaîne et un caractère (et votre chaîne n'a pas de terminaison nulle). Pour l'utiliser en tant que chaîne de caractères, vous devez modifier le code comme suit :

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

...

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

Pour l'utiliser en tant que caractère, vous devez modifier votre instruction print comme suit :

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

0voto

Michael Barth Points 1983

Voir ici pour une explication de la gestion des chaînes de caractères en C : http://www.macdonald.egate.net/CompSci/hstrings.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X