【发布时间】:2025-12-31 11:40:07
【问题描述】:
我今天偶然发现了一个奇怪的 C 语言,我无法理解其背后的原因。
如果我有这样的功能(假设是 32 位架构):
void printSize(char array[6]) {
printf("%zd\n", sizeof array);
}
我会得到 4,这是指针的大小。我期望得到 6,这是函数原型中明确声明的大小。
我知道数组是通过引用传递的,并且底层类型是指针。我假设将数组的长度放入原型中将为编译器提供返回 6 所需的信息。
为什么 C 会这样做?另外,如果编译器甚至不能执行 sizeof() 并返回那个大小,那么在原型中放置一个大小有什么意义呢?
【问题讨论】:
-
“阵列衰减”或类似的搜索词可能是一个有用的搜索词。
-
将大小放入参数中的唯一真正意义在于自我记录。数组参数衰减为指针,因此就编译器而言,大小无关紧要。
-
@PaulR 怎么样?
void printSize(char (*array)[6]);与void printSize(char (*array)[]);? -
@PaulR 我知道这种衰减,但我假设将大小放在原型中会将长度信息恢复到编译器的函数范围。我的问题是为什么编译器不这样做。他们本可以让它以这种方式工作,但出于某种原因选择不这样做
-
@FredLarson 它没有,但请阅读整个内容......我理解为什么它们会衰减为指针。我不明白为什么设计选择忽略了声明/原型中提供的尺寸信息?他们是否认为这是不安全的,因为调用代码可以选择不实际遵守尺寸信息?
标签: c sizeof function-prototypes