Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编译器中的变量大小依赖吗?_C_Gcc_Parameters_Mingw - Fatal编程技术网

C编译器中的变量大小依赖吗?

C编译器中的变量大小依赖吗?,c,gcc,parameters,mingw,C,Gcc,Parameters,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; } 当上述代码在GCC 6.3或更低版本中编译时,输出为: 大小为2 在MinGW编译器中编译代码时,输出为Size为1 与此相反,我们过去研究

考虑到以下准则:

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;
}
  • 当上述代码在GCC 6.3或更低版本中编译时,输出为:
    大小为2
  • 在MinGW编译器中编译代码时,输出为
    Size为1
与此相反,我们过去研究的是,当数组作为参数传递时,它只传递数组的基址(隐式指针变量和整数变量都是4字节)


变量大小是否依赖于编译器,或者我在这里遗漏了什么?请更正我,作为函数参数,arr[]是指针<代码>sizeof(arr)/sizeof(arr[0])是指针的大小/int的大小。没有涉及数组

C编译器中的变量大小依赖吗

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

对象指针可以是16位、32位、64位等。1(必须至少是16位)

指针通常比
int
宽,但可能相同或(很少)更小。比率可以是2/1或1/1或其他



1其他尺寸也是可能的,并已采用,如36位
int
或48位对象指针。这是C语言的能力,它几乎可以应用于任何处理器,也可以应用于所有新的处理器。灵活性的代价是,可移植代码必须考虑这些变化。

可变大小是否取决于编译器?
是的,它取决于编译器,但这并不意味着架构的观点是无关的。它还取决于体系结构是否为
16/32/64
位系统,例如,在
16位
机器中,
sizeof(int)
2
字节,在
32位
机器中是
4
字节

它被认为是处理器的本机大小,即寄存器的大小

这里的函数参数
arr[]
是指针而不是数组

所以,如果系统是
32
位系统,那么

sizeof(arr)/sizeof(arr[0])

将导致
1
4/4=1

我发现@Eric对编译器和架构在定义变量大小方面的作用的评论非常真实和有趣


类型的大小最终由C实现决定 (特别是编译器),而不是体系结构或操作系统。 而C实现通常受到 计算机实际上是通用图灵机,所以 可以实现任何所需的尺寸选择。C 实现有时会根据需要选择大小 要支持源代码,而不是最有效的源代码 建筑。它们甚至可以通过 命令行开关


是的,类型的大小取决于实现。特别是,指向
int
的指针的大小和
int
的大小取决于C实现(主要是编译器),并且可能彼此不同

“数组的基址(隐式指针变量和整数变量都是4字节)”中包含的问题中的断言通常是错误的。这在一些C实现中是正确的,但在其他实现中是错误的

函数中的代码
sizeof(arr)/sizeof(arr[0])
void print(int arr[])声明。
打印指向
int
的指针的大小除以
int
的大小


虽然C实现受到其目标体系结构和操作系统的严重影响,但他们可能会出于执行速度以外的原因选择其类型的大小,例如支持较小的内存使用,支持编写的代码不能完全移植到任何类型大小,或者支持更方便地使用大整数。

arr[]
是一个要点<代码>sizeof(arr)/sizeof(arr[0])
是指针的大小/int的大小。不涉及数组。在C语言中,每一个使用数组的函数都应该给出该数组的大小,通常通过一些其他参数指定
int
的大小取决于编译器,但理论上编译器可能会根据目标平台对其进行更改,CPU或编译器开关。上面提到的问题是在遵循GCC6.3的代码竞争平台上进行的。因此,我认为最好预先假设类似的平台将遵循2:1的比例?@mustangDC是合理的,尽管健壮的代码并不依赖于2:1的比例。类型的大小最终取决于C实现(尤其是编译器),而不是体系结构或操作系统。虽然C实现通常受到体系结构的严重影响,但计算机实际上是通用图灵机,因此可以实现任何所需的大小选择。C实现有时会根据需要支持的源代码而不是体系结构最有效的源代码来选择大小。他们甚至可以通过命令行开关支持大小的选择。谢谢分享。