为了账号安全,请及时绑定邮箱和手机立即绑定

为什么数组参数的大小与main中的大小不同?

为什么数组参数的大小与main中的大小不同?

C C++
慕工程0101907 2019-05-29 16:50:15
为什么数组参数的大小与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*)


查看完整回答
反对 回复 2019-05-29
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

它是一个指针,这就是为什么它是一个常见的实现,将数组的大小作为第二个参数传递给函数


查看完整回答
反对 回复 2019-05-29
?
杨魅力

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] ) );}


查看完整回答
反对 回复 2019-05-29
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

因此,您需要将数组的长度作为第二个参数传递。当您编写代码时,您既要声明一个常量大小的数组,然后将该数组传递给函数,那么让数组长度常量显示在代码中的几个位置是很痛苦的...

K&R救援:

#define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))

所以现在你可以这样做:

int a[10];...myfunction(a, N_ELEMENTS(a));


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 560 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信