Saya menjalankan program berikut di komputer saya (Intel 64-bit menjalankan 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;
}
Output dari program ini adalah
$ 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
Ukuran pointer &argv
adalah 8 byte. Saya mengharapkan alamat argc
menjadi address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
tetapi ada padding 4 byte di antara mereka. Mengapa demikian?
Dugaan saya adalah bahwa hal itu bisa disebabkan oleh penyelarasan memori, tetapi saya tidak yakin.
Saya melihat perilaku yang sama dengan fungsi yang saya panggil juga.
main
. Dalam C, main
dapat disebut sebagai fungsi reguler, sehingga perlu menerima argumen seperti fungsi biasa dan harus mematuhi ABI.
%zu
main
.