32 位和 64 位架构

32 bits and 64 bits architecture

在这里,结果变成了3和1,这对我来说很有意义。但是,当代码在 64 位架构上为 运行 时,结果变为 3 和 2。您能解释为什么会这样吗?

#include <stdio.h>

void print(int* a)
{
    int len = sizeof(a)/sizeof(a[0]);
    printf("%d", len);
}

int main(void) {
    int a[]= {11, 22, 33};
int len = sizeof(a)/sizeof(a[0]);
printf("%d\n", len);
    print(a);
}

sizeof(int*) 在 64 位上将是 8 个字节,而在 32 位上只有 4 个字节。 sizeof(int) 在这两种情况下都可能是 32 位。

因此对于 32 位情况:

int len = sizeof(a)/sizeof(int);    // (12/4) = 3
int len = sizeof(int*)/sizeof(int); //  (4/4) = 1

对于 64 位情况:

int len = sizeof(a)/sizeof(int);    // (12/4) = 3
int len = sizeof(int*)/sizeof(int); //  (8/4) = 2

也许你对这部分感到困惑:

void print(int* a)
{
    int len = sizeof(a)/sizeof(a[0]);
    ...
}
上面的

a 退化为指针 int*。在它上面使用 sizeof 是给你指向数组的指针的大小,而不是数组的内容。