鱼C论坛

 找回密码
 立即注册
查看: 2156|回复: 6

[已解决]为啥sizeof获得的数组长度为8

[复制链接]
发表于 2022-10-10 14:42:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void get_array(int a[5]);
void get_array(int a[5]) {
        int i;
        printf("传入数组长度为%d\n",sizeof(a));//打印结果为8
}
int main() {
        int i;
        int a[5];
        for(i=0; i<5; i++) {
                printf("请输入%d个数\n",(i+1));
                scanf("%d",&a[i]);
        }
        get_array(a);
        return 0;
}
最佳答案
2022-10-10 14:54:50
本帖最后由 jackz007 于 2022-10-10 14:58 编辑

       传入函数 get_array(int a[5]) 的参数 a 只是一个指针变量,sizeof(a) 只能获得变量 a (指针)本身所占用的内存空间,而并不是数组的,由于你的程序是 64 位的,一个指针占用 8 个字节,所以,sizeof(a) 的值就是 8。如果把代码编译成 32 位程序,那么,这个值便会是 4。
       所以,不可以在函数内用 sizeof() 来获取传入数组的元素数量,必须要想其它办法,比如,专门增加一个输入参数,或者,用数组的第一个元素进行传递等等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-10 14:54:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-10 14:58 编辑

       传入函数 get_array(int a[5]) 的参数 a 只是一个指针变量,sizeof(a) 只能获得变量 a (指针)本身所占用的内存空间,而并不是数组的,由于你的程序是 64 位的,一个指针占用 8 个字节,所以,sizeof(a) 的值就是 8。如果把代码编译成 32 位程序,那么,这个值便会是 4。
       所以,不可以在函数内用 sizeof() 来获取传入数组的元素数量,必须要想其它办法,比如,专门增加一个输入参数,或者,用数组的第一个元素进行传递等等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-10 21:46:15 | 显示全部楼层
jackz007 发表于 2022-10-10 14:54
传入函数 get_array(int a[5]) 的参数 a 只是一个指针变量,sizeof(a) 只能获得变量 a (指针)本身 ...

感谢大佬,我这边还有个问题:
        int a[5]={1,2,3,4,5};
        int i;
        printf("%d",sizeof(a));
这样打印的sizeof的值是20,按照8位的话应该是40,求解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-10 21:55:12 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-10 22:00 编辑
homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a[5]={1,2,3,4,5};
        int i;


       通过 int a[5] 定义的数组名 a 是和它所占用的空间进行绑定的,所以,a 不是一个变量,而是一块内存,例如,我们不可以以任何方法改变 a 的值,在 a 的有效作用域范围内,都可以根据 sizeof(a) 来确定数组 a 所占用的字节数,这一点和作为参数声明的函数参数 int b[5] 是完全不同的,因为 b 是一个指针变量,不是一块内存本身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-10 21:58:07 | 显示全部楼层
homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a[5]={1,2,3,4,5};
        int i;

因为在你现在的这个环境上,一个int是4个字节
5个int就是20个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 00:31:48 | 显示全部楼层
本帖最后由 jackz007 于 2022-10-11 00:34 编辑
homeskating 发表于 2022-10-10 21:46
感谢大佬,我这边还有个问题:
        int a[5]={1,2,3,4,5};
        int i;


        再举个例子
        int a[5]={1,2,3,4,5} , * b = a ;
        printf("sizeof(a) = %d\n",sizeof(a));
        printf("sizeof(b) = %d\n",sizeof(b));
        在这个例子中,指针 b 指向了数组 a,可以通过 b 来访问 a,不仅如此,还可以使用和访问 a 完全一样的方式来访问 b,例如,b[0] 就是 a[0],b[3] 就是 a[3]等等。但是,正如上面的代码所展示的结果那样,a 和 b 显然是存在本质区别的,a 代表数组本身,b 只是一个指针。在函数内使用 sizeof() 测试传入的数组大小,实际上得到的只能是一个指针的,而不可能是数组本身的大小。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-10-11 10:24:05 | 显示全部楼层
jackz007 发表于 2022-10-11 00:31
再举个例子

        在这个例子中,指针 b 指向了数组 a,可以通过 b 来访问 a,不仅如此, ...

好的,感谢老哥,理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表