Ich habe das folgende Programm auf meinem Computer ausgeführt (64-Bit-Intel unter 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;
}
Die Ausgabe des Programms war
$ 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
Die Größe des Zeigers &argv
beträgt 8 Bytes. Ich habe erwartet, dass die Adresse von lautet argc
, address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
aber dazwischen befindet sich ein 4-Byte-Abstand. Warum ist das so?
Ich vermute, dass es an der Speicherausrichtung liegen könnte, bin mir aber nicht sicher.
Ich bemerke das gleiche Verhalten auch bei den Funktionen, die ich aufrufe.
main
. In C main
kann als reguläre Funktion aufgerufen werden, daher muss es Argumente wie eine reguläre Funktion empfangen und dem ABI gehorchen.
%zu
main
.