Dans le code ci-dessous,
#include int main(){ char array[] = {'1', 2, 5.2}; char* my_pointer = array[2]; printf("%c", *my_pointer); }
5.2
est stocké dans la représentation IEEE 754 en mémoire, char
sélectionne 8 bits (en premier) dans cette représentation flottante, en raison du format endian limité.
C est un langage mal typé. Suis autorisé à lancer float
à char
.
Pourquoi le programme est-il vidé de son kernel?
char* my_pointer = array[2];
est faux. Le RHS de qui est de type char
, pas un char*
. L’augmentation du niveau d’avertissement dans votre compilateur vous aidera à identifier des problèmes de ce type.
Avec gcc -Wall
, j’obtiens l’avertissement suivant:
soc.c: In function 'main': soc.c:4:23: warning: initialization makes pointer from integer without a cast char* my_pointer = array[2];
Après cela, le programme a un comportement indéfini.
Ce dont vous avez besoin c’est:
char* my_pointer = &array[2];
ou
char* my_pointer = array + 2;
Dans votre programme, changez char *my_pointer = array[2];
to char *my_pointer = &array[2];
en tant que pointeur devrait stocker l’adresse.
#include int main(){ char array[] = {'1', 2, 45.2}; char *my_pointer = &array[2]; printf("%c", *my_pointer); }
sortie:
- //NOTE: asci value of - is 45
Comme @AnT l’ a mentionné dans les commentaires, lorsque vous convertissez 45.2
en type char
, le compilateur génère un code qui charge 45.2
, tronque la valeur et la stocke dans votre variable char
sous la forme 45
, lorsque vous imprimez, vous obtenez -
en sortie.