Tôi đã chạy chương trình sau trên máy tính của mình (Intel 64-bit chạy 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;
}
Đầu ra của chương trình là
$ 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
Kích thước của con trỏ &argv
là 8 byte. Tôi dự kiến địa chỉ argc
là address of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
nhưng có một vùng đệm 4 byte ở giữa chúng. Tại sao điều này là trường hợp?
Tôi đoán là nó có thể là do căn chỉnh bộ nhớ, nhưng tôi không chắc chắn.
Tôi nhận thấy hành vi tương tự với các chức năng tôi gọi là tốt.
main
. Trong C, main
có thể được gọi là một hàm thông thường, vì vậy nó cần nhận các đối số như một hàm thông thường và phải tuân theo ABI.
%zu
main
.