l’initialisation crée un entier à partir d’un pointeur sans transtypage

Je viens de commencer à apprendre à programmer et j’ai rencontré cette erreur qui se présente ainsi: “L’initialisation rend le nombre entier de pointeur sans transtypage [activé par défaut]” Quel est le problème?

// This program pairs three kids with their favorite superhero #include  #include  main() { char Kid1[12]; // Kid1 can hold an 11-character name // Kid2 will be 7 characters (Maddie plus null 0) char Kid2[] = "Maddie"; // Kid3 is also 7 characters, but specifically defined char Kid3[7] = "Andrew"; // Hero1 will be 7 characters (adding null 0!) char Hero1 = "Batman"; // Hero2 will have extra room just in case char Hero2[34] = "Spiderman"; char Hero3[25]; Kid1[0] = 'K'; //Kid1 is being defined character-by-character Kid1[1] = 'a'; //Not efficient, but it does work Kid1[2] = 't'; Kid1[3] = 'i'; Kid1[4] = 'e'; Kid1[5] = '\0'; // Never forget the null 0 so C knows when the // ssortingng ends strcpy(Hero3, "The Incredible Hulk"); printf("%s\'s favorite hero is %s.\n", Kid1, Hero1); printf("%s\'s favorite hero is %s.\n", Kid2, Hero2); printf("%s\'s favorite hero is %s.\n", Kid3, Hero3); return 0; } 

 char Hero1 = "Batman"; 

devrait être

 char Hero1[] = "Batman"; 

Quelques fois, vous avez des problèmes:

 #include  #include  main() { char Kid1[12]; // Kid1 can hold an 11-character name // Kid2 will be 7 characters (Maddie plus null 0) char Kid2[] = "Maddie"; // Kid3 is also 7 characters, but specifically defined char Kid3[7] = "Andrew"; // Hero1 will be 7 characters (adding null 0!) char *Hero1 = "Batman"; //needs to be a pointer // Hero2 will have extra room just in case char *Hero2 = "Spiderman"; //needs to be a pointer char Hero3[25] Kid1[0] = 'K'; //Kid1 is being defined character-by-character Kid1[1] = 'a'; //Not efficient, but it does work Kid1[2] = 't'; Kid1[3] = 'i'; Kid1[4] = 'e'; Kid1[5] = '\0'; // Never forget the null 0 so C knows when the // ssortingng ends strcpy(Hero3, "The Incredible Hulk"); printf("%s\'s favorite hero is %s.\n", Kid1, Hero1); printf("%s\'s favorite hero is %s.\n", Kid2, Hero2); printf("%s\'s favorite hero is %s.\n", Kid3, Hero3); return 0; } 

Vous devriez définir tous vos vars en haut de la fonction, c’est une bonne pratique en C.

En dehors de cela, j’ai signalé les problèmes (et les ai corrigés) avec des commentaires.

Le problème est avec char Hero1 = "Batman" :

  • Lorsque vous utilisez une chaîne de caractères entre guillemets dans votre code, le compilateur la remplace par un pointeur vers le début de l’espace mémoire dans lequel la chaîne résidera pendant l’exécution.
  • Donc, par caractère char Hero1 = "Batman" , vous essayez en fait d’atsortingbuer une adresse mémoire (composée généralement de 32 ou 64 bits de données, selon votre système) à une variable de caractère (qui stocke généralement 8 bits de données).

Pour résoudre le problème, vous devez le remplacer par l’une des options suivantes:

  • char Hero1[] = "Batman"
  • char* Hero1 = "Batman"

Pour votre information, dans les deux cas ci-dessus, la chaîne "Batman" résidera dans une section de mémoire en lecture seule pendant l’exécution.

Cependant, il existe une différence notable entre ces deux cas:

  • En utilisant char Hero1[] , la chaîne "Batman" sera copiée dans la stack à chaque appel de la fonction. Le tableau Hero1 commencera à cette adresse et vous pourrez modifier le contenu de ce tableau ultérieurement dans la fonction.
  • char* Hero1 , la chaîne "Batman" ne sera pas copiée dans la stack à chaque appel de la fonction. La variable Hero1 pointera sur l’adresse d’origine de la chaîne. Par conséquent, vous ne pourrez pas modifier le contenu de cette chaîne en aucun sharepoint la fonction.

Lorsque l’image exécutable est générée à partir de votre code, la chaîne est placée dans la section de code, qui est l’une des sections de mémoire du programme. Le compilateur remplace ensuite la soi-disant “assignation de chaîne” par une “assignation d’entier”.

Par exemple, char* x = "abc" est remplacé par char* x = (char*)0x82004000 avant d’être compilé en code object, où 0x82004000 est l’adresse (constante) de la chaîne dans l’espace mémoire du programme.

Lorsque vous effectuez sizeof("abc") , l’image exécutable ne contiendra même pas la chaîne "abc" , car aucune opération “d’exécution” n’est effectuée sur cette chaîne.

Il n’y a pas de code object généré pour sizeof – le compilateur calcule cette valeur lors de la compilation et la remplace immédiatement par une constante .

Vous pouvez consulter le fichier de carte (intermédiaire) généralement généré et constater que la chaîne d’entrée de cette opération sizeof n’apparaît nulle part.