J'ai exécuté le programme suivant sur mon ordinateur (Intel 64 bits exécutant Linux).
#include <stdio.h>
void test(int argc, char **argv) {
printf("[test] Argc Pointer: %p\n", &argc);
printf("[test] Argv Pointer: %p\n", &argv);
}
int main(int argc, char **argv) {
printf("Argc Pointer: %p\n", &argc);
printf("Argv Pointer: %p\n", &argv);
printf("Size of &argc: %lu\n", sizeof (&argc));
printf("Size of &argv: %lu\n", sizeof (&argv));
test(argc, argv);
return 0;
}
Le résultat du programme a été
$ gcc size.c -o size
$ ./size
Argc Pointer: 0x7fffd7000e4c
Argv Pointer: 0x7fffd7000e40
Size of &argc: 8
Size of &argv: 8
[test] Argc Pointer: 0x7fffd7000e2c
[test] Argv Pointer: 0x7fffd7000e20
La taille du pointeur &argvest de 8 octets. Je m'attendais à ce que l'adresse argcsoit, address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8mais il y a un remplissage de 4 octets entre eux. pourquoi est-ce le cas?
Je suppose que cela pourrait être dû à l'alignement de la mémoire, mais je ne suis pas sûr.
Je remarque également le même comportement avec les fonctions que j'appelle.
main. En C, mainpeut être appelé comme une fonction régulière, il doit donc recevoir des arguments comme une fonction régulière et doit obéir à l'ABI.
%zu
main.