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 &argv
est de 8 octets. Je m'attendais à ce que l'adresse argc
soit, address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
mais 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, main
peut ê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
.