为什么作为参数发送的数组的大小与main中的大小不一样?
#include <stdio.h>
void PrintSize(int p_someArray[10]);
int main () {
int myArray[10];
printf("%d\n", sizeof(myArray)); /* As expected, 40 */
PrintSize(myArray);/* Prints 4, not 40 */
}
void PrintSize(int p_someArray[10]){
printf("%d\n", sizeof(p_someArray));
}
当您将数组类型传递给函数时,它会隐式地转换为指针类型。
所以,
void PrintSize(int p_someArray[10]) {
printf("%zu\n", sizeof(p_someArray));
}
和
void PrintSize(int *p_someArray) {
printf("%zu\n", sizeof(p_someArray));
}
是等价的。 所以您得到的是sizeof(int*)
的值
它是一个指针,这就是为什么将数组的大小作为第二个参数传递给函数是一个常见的实现
正如其他人所述,当数组用作函数参数时,它会衰减为指向其第一个元素的指针。 还值得注意的是,sizeof不计算表达式的值,并且在与表达式一起使用时不需要括号,因此实际上根本没有使用您的参数,因此您可以使用类型而不是值来编写sizeof。
#include <stdio.h>
void PrintSize1 ( int someArray[][10] );
void PrintSize2 ( int someArray[10] );
int main ()
{
int myArray[10];
printf ( "%d\n", sizeof myArray ); /* as expected 40 */
printf ( "%d\n", sizeof ( int[10] ) ); /* requires parens */
PrintSize1 ( 0 ); /* prints 40, does not evaluate 0[0] */
PrintSize2 ( 0 ); /* prints 40, someArray unused */
}
void PrintSize1 ( int someArray[][10] )
{
printf ( "%d\n", sizeof someArray[0] );
}
void PrintSize2 ( int someArray[10] )
{
printf ( "%d\n", sizeof ( int[10] ) );
}