ฉันรันโปรแกรมต่อไปนี้บนคอมพิวเตอร์ของฉัน (Intel 64 บิตที่ใช้ 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;
}
ผลลัพธ์ของโปรแกรมคือ
$ 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
ขนาดของตัวชี้&argv
คือ 8 ไบต์ ฉันคาดว่าที่อยู่argc
จะเป็นaddress of (argv) + sizeof (argv) = 0x7ffed1a4c9f0 + 0x8 = 0x7ffed1a4c9f8
แต่มีช่องว่างระหว่าง 4 ไบต์ เหตุใดจึงเป็นเช่นนี้
ฉันเดาว่าอาจเป็นเพราะการจัดตำแหน่งหน่วยความจำ แต่ฉันไม่แน่ใจ
ฉันสังเกตเห็นพฤติกรรมเดียวกันกับฟังก์ชั่นที่ฉันเรียกเช่นกัน
main
ที่ไม่ติดตั้งสำหรับ ใน C main
สามารถเรียกได้ว่าเป็นฟังก์ชั่นปกติดังนั้นจึงจำเป็นต้องได้รับการโต้แย้งเช่นฟังก์ชั่นปกติและจะต้องเชื่อฟัง ABI
%zu
main
หรือห้องสมุดเสื้อคลุมที่ไม่ติดตั้งสำหรับ