Ejecuté el siguiente programa en mi computadora (Intel de 64 bits 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;
}
La salida del programa fue
$ 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
El tamaño del puntero &argves de 8 bytes. Esperaba que la dirección argcfuera, address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8pero hay un relleno de 4 bytes entre ellos. ¿Por qué es este el caso?
Supongo que podría deberse a la alineación de la memoria, pero no estoy seguro.
Noto el mismo comportamiento con las funciones que llamo también.
main. En C, mainse puede llamar como una función regular, por lo que necesita recibir argumentos como una función regular y debe obedecer la ABI.
%zu
main.