首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • sizeof求数组长度不解..请教! [已结贴,结贴人:LUCKYWATER]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 14:59:45 楼主
    本来是要求两个数组的和.可在求数组长度的时候却出错.
    在主函数中定义了 a,b数组.
    在main函数中sizeof(a)/sizeof(a[0])执行结果为4.
    但是在arraysum函数中执行sizeof(a)/sizeof(a[0])结果却为1.

    为什么会出现这问题.


    void arraySum(int a[],int b[])
    {
    cout < <"sizeof(a)" < <sizeof(a) < <endl;
    cout < <"sizeof(a[0])" < <sizeof(int) < <endl;
    int length_a = sizeof(a)/sizeof(int);

    }
    void main()
    {
    int a[]={1,2,3,4};
    int b[]={1,2,3,4};

    cout < <"main:a[]" < <a < <"sizeof(a)" < <sizeof(a) < <endl;
    cout < <sizeof(a)/sizeof(a[0]) < <endl;

    arraySum(a,b);
    }
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:02:131楼 得分:50
    找本C语言基础书,比如《C语言大全》,看一下形参中数组自动退化为指针的章节吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:03:432楼 得分:30
    void arraySum(int a[],int b[])
    在函数中用数组做参数和用指针做参数等价
    既然指针的大小都是4,sizeof(a)就是4,sizeof(a[0])也是4,结果就是1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:05:393楼 得分:0

    sizeof可是在编译期完成计算的
    int a[]相当于 int *a;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:06:044楼 得分:0
    数组名作为函数参数时会退化为指针

    C/C++ code
    void arraySum(int a[],int b[]) { cout < <"sizeof(a)" < <sizeof(a) < <endl; cout < <"sizeof(a[0])" < <sizeof(int) < <endl; int length_a = sizeof(a)/sizeof(int); } // 等价于: void arraySum(int *a,int *b) { cout < <"sizeof(a)" < <sizeof(a) < <endl; cout < <"sizeof(a[0])" < <sizeof(int) < <endl; int length_a = sizeof(a)/sizeof(int); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:07:135楼 得分:10
    引用 1 楼 taodm 的回复:
    找本C语言基础书,比如《C语言大全》,看一下形参中数组自动退化为指针的章节吧。


    C/C++ code
    形参中数组自动退化为指针

    林锐的《高质量C/C++》也多看看吧
    呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:08:476楼 得分:10
    没错,当数组作参数的时候,就退化为point,所以大小就是了.
    如果是正常的使用数组,就是实际的大小了。所以一般都建议自己把数组的大小单独传送了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:09:447楼 得分:0
    引用 4 楼 xkyx_cn 的回复:
    数组名作为函数参数时会退化为指针

    也不见得

    void arraySum(int a[4],int b[4])
    {
    cout < <"sizeof(a)" < <sizeof(a) < <endl;
    cout < <"sizeof(a[0])" < <sizeof(int) < <endl;
    int length_a = sizeof(a)/sizeof(int);

    }
    这样可以!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:09:488楼 得分:0
    引用 2 楼 matrixdwy 的回复:
    void arraySum(int a[],int b[])
    在函数中用数组做参数和用指针做参数等价
    既然指针的大小都是4,sizeof(a)就是4,sizeof(a[0])也是4,结果就是1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:10:259楼 得分:0
    没有啊,你得到的结果不对,main中的得到的16,而arraysum(a,b)中得到的应该是4

    原因是这样的在main中sizeof(a)是指数级a所有成员所占用的空间.
    而arraysum(int a[],int b[])中的a实际上是指针,和arryasum(int *a, int *b);实际上是等价的,这时执行sizeof(a); 实际上是求指针a的空间,所以是4
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:11:1510楼 得分:0
    大概我没说清楚....
    我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

    int a[] 和 int *a 效果一样.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:12:4411楼 得分:0
    引用 10 楼 LUCKYWATER 的回复:
    大概我没说清楚....
    我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

    int a[] 和 int *a 效果一样.

    是你不愿意去翻书而已。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:14:1412楼 得分:0
    引用 10 楼 LUCKYWATER 的回复:
    大概我没说清楚....
    我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

    int a[] 和 int *a 效果一样.


    跟你说了, sizeof可是在编译期完成计算的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:22:5013楼 得分:0
    不可以

    引用 7 楼 artman 的回复:
    引用 4 楼 xkyx_cn 的回复:
    数组名作为函数参数时会退化为指针

    也不见得

    void arraySum(int a[4],int b[4])
    {
    cout < <"sizeof(a)" < <sizeof(a) < <endl;
    cout < <"sizeof(a[0])" < <sizeof(int) < <endl;
    int length_a = sizeof(a)/sizeof(int);

    }
    这样可以!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-07-01 15:35:1614楼 得分:0
    明白了.
    谢谢.....

    taodm说的指针一开始没理解.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wienee
    • 等级:
    发表于:2008-07-01 15:50:3815楼 得分:0
    大概大家没说清楚....
    大家的意思是,同是sizeof求变量大小,但是在main求的是数组的大小在arraySum里求的是指针的大小,
    所以main和arraySum中求出来的值不一样.

    下面解释一下为什么会是这样:
    c语言规定函数传值按值传递,即形参值是实参值的一份拷贝,因此理想情况下即使参数是数组,也要对数组进行拷贝,但是出于对效率的考虑,c语言不会这样做,它将会把形参由数组变更为(更确切地说是退化为)一个指针,并且将指针指向实参数组的首地址,因此你在arraySum函数中求得的是指针大小并非它所指向的数组的长度。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved