sizeof求数组长度不解..请教!

LUCKYWATER 2008-07-01 02: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);
}
...全文
635 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqiang312 2009-09-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wienee 的回复:]
大概大家没说清楚....
大家的意思是,同是sizeof求变量大小,但是在main求的是数组的大小在arraySum里求的是指针的大小,
所以main和arraySum中求出来的值不一样.

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

很清楚了
王熙伟 2008-07-01
  • 打赏
  • 举报
回复
大概大家没说清楚....
大家的意思是,同是sizeof求变量大小,但是在main求的是数组的大小在arraySum里求的是指针的大小,
所以main和arraySum中求出来的值不一样.

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

taodm说的指针一开始没理解.
xkyx_cn 2008-07-01
  • 打赏
  • 举报
回复
不可以

[Quote=引用 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);

}
这样可以!
[/Quote]
artman 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 LUCKYWATER 的回复:]
大概我没说清楚....
我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

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

跟你说了, sizeof可是在编译期完成计算的
taodm 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 LUCKYWATER 的回复:]
大概我没说清楚....
我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

int a[] 和 int *a 效果一样.
[/Quote]
是你不愿意去翻书而已。
LUCKYWATER 2008-07-01
  • 打赏
  • 举报
回复
大概我没说清楚....
我的意思是,同是sizeof求数组大小,为什么main和函数中求出来的值不一样.

int a[] 和 int *a 效果一样.
lmyuanhang 2008-07-01
  • 打赏
  • 举报
回复
没有啊,你得到的结果不对,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
sukyin 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 matrixdwy 的回复:]
void arraySum(int a[],int b[])
在函数中用数组做参数和用指针做参数等价
既然指针的大小都是4,sizeof(a)就是4,sizeof(a[0])也是4,结果就是1
[/Quote]
artman 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xkyx_cn 的回复:]
数组名作为函数参数时会退化为指针
[/Quote]
也不见得

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

}
这样可以!
na_he 2008-07-01
  • 打赏
  • 举报
回复
没错,当数组作参数的时候,就退化为point,所以大小就是了.
如果是正常的使用数组,就是实际的大小了。所以一般都建议自己把数组的大小单独传送了。
simo110 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
找本C语言基础书,比如《C语言大全》,看一下形参中数组自动退化为指针的章节吧。
[/Quote]

形参中数组自动退化为指针

林锐的《高质量C/C++》也多看看吧
呵呵
xkyx_cn 2008-07-01
  • 打赏
  • 举报
回复
数组名作为函数参数时会退化为指针


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

}
artman 2008-07-01
  • 打赏
  • 举报
回复

sizeof可是在编译期完成计算的
int a[]相当于 int *a;
matrixdwy 2008-07-01
  • 打赏
  • 举报
回复
void arraySum(int a[],int b[])
在函数中用数组做参数和用指针做参数等价
既然指针的大小都是4,sizeof(a)就是4,sizeof(a[0])也是4,结果就是1
taodm 2008-07-01
  • 打赏
  • 举报
回复
找本C语言基础书,比如《C语言大全》,看一下形参中数组自动退化为指针的章节吧。

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧