我在计算机(运行Linux的64位Intel)上运行了以下程序。
#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字节的填充。为什么会这样呢?
我的猜测是,这可能是由于内存对齐所致,但我不确定。
我注意到与调用的函数相同的行为。
                  @aschepler:不应依赖为设置的任何包装器
                
                  
                    —
                    埃里克·Postpischil 
                    
                  
                
              main。在C语言中,main可以将其称为常规函数,因此它需要像常规函数一样接收参数,并且必须遵守ABI。
                
                  @aschelper:我注意到其他功能也有相同的行为。
                
                
                  
                    —
                    letmutx 
                    
                  
                
              
                  这是一个有趣的“思想实验”,但实际上,没有什么比“我想知道为什么”更重要了。这些地址可以根据操作系统,编译器,编译器版本,处理器体系结构进行更改,并且在任何情况下都不应依赖于它们。
                
                
                  
                    —
                    尼尔
                    
                  
                
              
main。