C++中数组作为参数传递时,是否能在传递过后求该数组的大小呢?

今天在写程序 时,发现如下代码运行有问题:

void multPacket(int dest[],int pid)
{
	int member=sizeof(dest)/sizeof(int);//表示成員個數
	cout<<sizeof(dest)<<endl;
	cout<<sizeof(int)<<endl;
	for(int i=0;i<member;i++)
	{
		cout<<"已經向第"<<dest[i]<<"個用戶發送報文"<<pid<<endl;
	}
}
通过输出结果发现,只能输出第一个元素 ,即dest[1] ,添加了两行输出代码后,发现sizeof(dest)竟然长度为4。

原来使用这种方法调用函数时,传入函数内的dest实际上是原dest的首地址,并不是dest这个数组,换句话说,传进去的是指向dest数组的指针,这样当然无法获得dest数组的正确大小。

当你定义一个数组的时候: 
int   a[]   =   {1,   2,   3};     //   实际上被编译为   int   a[3]   =   {1,2,3} 

数组名代表的是数组的地址。注意   ——   你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。 

那么   sizeof   是怎么回事呢?他不是通过   a   的名字获得   a的大小了么?   ——   大错特错! 

关键字   sizeof   产生的是一个编译期常量(注1)   他的运作方式是这样的: 

当你写: 
sizeof   a   
实质是: 
sizeof   (   a的类型   ) 

而a的类型是什么呢?编译器察看   a的定义发现,   是   int   [3] 
就是说,这里   sizeof   a   实质是: 
sizeof   (   int[3]   ) 
完全等同于常量   12   (假定int为4字节)。 


考虑一个函数 
void   func(   int   a[]   );     
//   写成   int   a[3]   也不会有本质区别——也许你该试试写成   int   (&a)   [3]   ? 

C++规定,数组作为形参的时候,a代表数组首地址。 
他的底层意义是:   a   退化为了一个4字节的指针,没有任何变量表示数组的大小会“自动”被传递进来。 

我们看看这个时候   sizeof   a是什么: 
sizeof(   函数形参的a[]   )     =   sizeof(   int*   const   )   =   4     //   当然a[]不是合法的C++类型


因此,因此,此处的sizeof(dest)等同于上面的sizeof(a[])
所以,要在传递数组前,将该数组的长度算出来,然后一并作为参数传过来。

修改代码如下:

void multPacket(int dest[],int pid,int size)//pid表示报文号  size 表示dest的长度
{
	//int member=sizeof(dest)/sizeof(int);//表示成員個數
	//cout<<sizeof(dest)<<endl;
	//cout<<sizeof(int)<<endl;
	for(int i=0;i<size;i++)
	{
		cout<<"已經向第"<<dest[i]<<"個用戶發送報文"<<pid<<endl;
	}
}
在调用函数之前,就将dest的size算出来,然后传进来就行了!

problem solved!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值