为什么数组参数的大小与main中的大小不同?为什么作为参数发送的数组的大小与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));}
4 回答
小唯快跑啊
TA贡献1863条经验 获得超2个赞
将数组类型传递给函数时,会隐式转换为指针类型。
所以,
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*)
杨魅力
TA贡献1811条经验 获得超6个赞
正如其他人所说,当用作函数参数时,数组会衰减到指向第一个元素的指针。还值得注意的是,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] ) );}
江户川乱折腾
TA贡献1851条经验 获得超5个赞
因此,您需要将数组的长度作为第二个参数传递。当您编写代码时,您既要声明一个常量大小的数组,然后将该数组传递给函数,那么让数组长度常量显示在代码中的几个位置是很痛苦的...
K&R救援:
#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
所以现在你可以这样做:
int a[10];...myfunction(a, N_ELEMENTS(a));
- 4 回答
- 0 关注
- 560 浏览
添加回答
举报
0/150
提交
取消