Ho eseguito il seguente programma sul mio computer (Intel a 64 bit con 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;
}
L'output del programma era
$ 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 dimensione del puntatore &argvè di 8 byte. Mi aspettavo che l'indirizzo argcfosse, address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8ma tra loro c'è un padding di 4 byte. Perché è così?
La mia ipotesi è che potrebbe essere dovuto all'allineamento della memoria, ma non sono sicuro.
Noto lo stesso comportamento anche con le funzioni che chiamo.
main. In C, mainpuò essere chiamato come una funzione regolare, quindi deve ricevere argomenti come una funzione regolare e deve obbedire all'ABI.
%zu
main.