Supposons que j'ai deux fichiers: file1.c- contient la définition globale d'un tableau int de taille 10 nommé "tableau [10]". file2.c- contient un pointeur int nommé "extern int * array", ici j'essaye de lier ce pointeur au tableau. Mais quand je vérifie l'adresse de tableau dans file1.c et la valeur de pointeur dans file2.c, ils sont tous les deux différents. Pourquoi cela se passe-t-il?en utilisant extern pour lier un tableau avec un pointeur
Répondre
qui ne fonctionne pas, en file2.c
, vous avez besoin
extern int array[];
puisque les tableaux et les pointeurs ne sont pas la même chose. Les deux déclarations doivent avoir les types compatibles, et int*
n'est pas compatible avec int[N]
. Ce qui se passe réellement n'est pas spécifié, le programme est mal formé avec extern int *array;
, mais probablement, les premiers sizeof(int*)
octets du tableau sont interprétés comme une adresse.
extern1.c
#include <stdio.h>
extern int *array;
int test();
int main(int argc, char *argv[])
{
printf ("in main: array address = %x\n", array);
test();
return 0;
}
extern2.c
int array[10] = {1, 2, 3};
int test()
{
printf ("in test: array address = %x\n", array);
return 0;
}
La sortie:
in main: array address = 1
in test: array address = 804a040
Et le code assembler:
08048404 <main>:
8048404: 55 push %ebp
8048405: 89 e5 mov %esp,%ebp
8048407: 83 e4 f0 and $0xfffffff0,%esp
804840a: 83 ec 10 sub $0x10,%esp
804840d: 8b 15 40 a0 04 08 mov 0x804a040,%edx <--------- this (1)
8048413: b8 20 85 04 08 mov $0x8048520,%eax
8048418: 89 54 24 04 mov %edx,0x4(%esp)
804841c: 89 04 24 mov %eax,(%esp)
804841f: e8 dc fe ff ff call 8048300 <[email protected]>
8048424: e8 07 00 00 00 call 8048430 <test>
8048429: b8 00 00 00 00 mov $0x0,%eax
804842e: c9 leave
804842f: c3 ret
08048430 <test>:
8048430: 55 push %ebp
8048431: 89 e5 mov %esp,%ebp
8048433: 83 ec 18 sub $0x18,%esp
8048436: c7 44 24 04 40 a0 04 movl $0x804a040,0x4(%esp) <------- this (2)
804843d: 08
804843e: c7 04 24 3d 85 04 08 movl $0x804853d,(%esp)
8048445: e8 b6 fe ff ff call 8048300 <[email protected]>
804844a: b8 00 00 00 00 mov $0x0,%eax
804844f: c9 leave
8048450: c3 ret
Faites attention au < ------- dans le code d'assemblage. Vous pouvez voir dans la fonction principale que le tableau est array [0] et dans la fonction test le tableau est l'adresse.
Dans 'main' vous n'imprimez pas l'adresse, mais la valeur du pointeur (et dans' test', la valeur du pointeur vers le premier élément dans lequel le tableau est converti lorsqu'il est passé à 'printf'). Si vous imprimez '& adresse' dans les deux, vous obtiendrez la même sortie. Bonne illustration –
- 1. Créer un tableau en utilisant un pointeur
- 2. en utilisant un pointeur pour un tableau multidémarré
- 3. extern const char * pointeur const ou un tableau extern const char [] cause de lien erreur
- 4. En utilisant sizeof pour un pointeur vers un pointeur sur un tableau de 2 flotteurs
- 5. En utilisant 'extern' pour créer tableau en C
- 6. Comment lier un pointeur brut avec Luabind
- 7. Pouvez-vous déclarer un pointeur comme extern en C++?
- 8. initialisation pointeur Extern
- 9. C++ en utilisant un pointeur pour pointer un autre pointeur
- 10. Bootloader utilisant un code mixte utilisant EXTERN
- 11. passer un tableau 2D en une fonction en utilisant un pointeur vers un pointeur variable c
- 12. Comment lier une fonction déclarée comme extern dans un fichier .h, pour créer un fichier .dll?
- 13. Travailler avec un tableau de structures en C en utilisant le pointeur vers le pointeur
- 14. Certains mystique avec pointeur 'extern' sur struct en C
- 15. Fonction pointeur avec un tableau
- 16. en utilisant `extern` avec typedef nom
- 17. inverse un tableau pointeur
- 18. C Programmation: malloc() pour un tableau 2D (en utilisant le pointeur à pointeur)
- 19. Comment accéder à un tableau 2D de taille inconnue en utilisant un pointeur vers un tableau
- 20. en utilisant un constructeur pour initialiser un pointeur de chaîne
- 21. Double pointeur expérimentant avec un tableau 2D
- 22. C# diviser un tableau d'entiers en utilisant le pointeur
- 23. tableau d'objets avec plusieurs paramètres utilisant un pointeur
- 24. pointeur null utilisant RandomInt avec un tableau d'entiers
- 25. Extern "C" Pointeur de fonction NULL
- 26. Lier un tableau de classes en utilisant jQuery
- 27. En utilisant un commutateur avec un tableau?
- 28. En utilisant le pointeur comme un tableau - C
- 29. à un tableau 2D en utilisant le double pointeur
- 30. Lier une image à un pointeur?
Mais que se passe-t-il réellement dans la mémoire? La mémoire est-elle allouée à la fois au tableau (40 octets) et au pointeur (4 octets sur 32 bits)? –
Comportement non défini (programme mal formé, en fait). Mais probablement, les quatre premiers (ou huit) octets du tableau sont interprétés comme une adresse. –
ok, mais l'éditeur de liens lie le pointeur à un tableau et ne signale pas une erreur de compilation. Pour ce qu'il relie réellement? – Azazle