C编译器中的可变大小是否依赖?

mus*_*gDC 2 c parameters gcc mingw

考虑以下代码:

void print(int arr[])
{
  int n = sizeof(arr)/sizeof(arr[0]);
  printf("\nSize is  %d",n);
}

int main()
{
    int arr[]={1,2,3,4,5,6};
    print(arr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 当上述代码在GCC 6.3或较小版本中编译时,输出为: size is 2.
  • 当代码在MinGW编译器中编译时,输出为 Size is 1

现在恰恰相反,我们曾经研究过,当一个数组作为参数传递时,它只传递数组的基地址(对于隐式指针变量和整数变量都是4个字节).

可变大小编译器是否依赖,或者我在这里遗漏了什么?请指正

chu*_*ica 5

arr[],作为函数参数,是一个指针. sizeof(arr)/sizeof(arr[0]);是一个指针/大小的大小int.没有涉及阵列.

C编译器中的可变大小是否依赖?

是的,int可以是32位,16位等1(必须至少16)

对象指针可以是16位,32位,64位等.1(必须至少为16)

指针通常比a宽int,但可以相同或(很少)更少.比例可以是2/1或1/1或其他.


1其他尺寸是可能的并且已被采用,例如36位int或48位对象指针.这是C能够采用任何有史以来构建的处理器,并且可能适用于所有新处理器.灵活性是以便携式代码必须考虑这些变化为代价的.