我将一个char
数组从函数f1传递给另一个函数f2。在函数f1中,我使用sizeof
&它导致9
。在第二个函数中,我再次使用与上面相同的语句打印其大小,但这次它导致8
。事实上,我在打印这两个值之间没有使用这个数组。当我尝试在不同的笔记本电脑上运行相同的代码时,对于第二个函数,它会生成4
。
从question可以清楚地知道为什么我得到4,但为什么我在另一台笔记本电脑上获得8。
为什么会这样?
我的整个代码太大了,所以我只分享了必不可少的部分:
(这里我正在谈论的数组是plid
,我从第一个函数调用函数login
。由于它们的长度,我没有共享完整的函数。logp, errorp..
这些是我自己编写的函数,写入文件,最后我分享了。)
F1 :
char choice[1], plid[9];
int choice_len = sizeof(choice);//this is importnat becz recvall takes ppointer to int
int ret;
logp(identity,0,0,"receiving the first choice of the client");
if(recvall(fd, choice, &choice_len, 0) != 0){ //whether want to play(login), or as audience(no login)
logp(identity,0,0,"Error receiving the first choice of the client");
}
logp(identity,0,0,"Entering the choice Select switch");
switch(choice[0])
{
case 'a':
sprintf(buf, "plid_len(%d), username_len(), plid - %d",sizeof(plid), plid);
logp(identity,0,0,buf);
logp(identity,0,0,"User entered the choice 'a' and calling login");
if( (ret = login(fd, plid)) == 0){
sprintf(buf,"Player id is %s and Contacting player",plid);
logp(identity,0,0,buf);
contactPlayer( plid, fd);
logp(identity,0,0,"Contacted To player succesfully");
}else{
F2 :
int login(int fd, char* plid){
char loginInfo[25], username[9], password[16];
int loginInfo_len = sizeof(loginInfo);
int ret;
char identity[IDENTITY_SIZE], buf[100];
sprintf(identity, "DISPATCHER-login-fd: %d -", fd);
sprintf(buf, "plid_len(%d), username_len(%d), plid - %d",sizeof(plid), sizeof(username), plid);
logp(identity,0,0,buf);
logp(identity,0,0,"Calling recvall to recv login credentials");
if ((ret = recvall(fd, loginInfo, &loginInfo_len, 0)) != 0) {
errorp(identity,0,0,"Unable to recv login credentials");
debugp(identity,1,errno,NULL);
}
日志文件输出:
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - DISPATCHER-SocketHandler-fd: 6 - | LogMsg - Entering the choice Select switch
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - DISPATCHER-SocketHandler-fd: 6 - | LogMsg - plid_len(9), username_len(), plid - -1314939296
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - DISPATCHER-SocketHandler-fd: 6 - | LogMsg - User entered the choice 'a' and calling login
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - DISPATCHER-login-fd: 6 - | LogMsg - plid_len(8), username_len(9), plid - -1314939296
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - DISPATCHER-login-fd: 6 - | LogMsg - Calling recvall to recv login credentials
__LOG__ | Wed Dec 26 19:21:34 2012 | Where - access-recvall | LogMsg - Successfully recved the complete data
答案 0 :(得分:4)
当您将数组传递给函数时,它会衰减为指向其第一个元素的指针
当你在接收参数的函数内应用sizeof
时,你得到指针的大小(在那个环境中),而不是数组的大小。
如果您需要函数内部的数组大小,只需将其作为附加函数参数传递。
答案 1 :(得分:0)
指针大小可能因架构而异,甚至可能在同一架构中(例如哈佛架构中)。
对于典型的桌面系统(运行Windows,Linux或OS X的x86),64位版本的操作系统需要8个字节的指针,而32位版本只需要4个字节。因此,如果您运行的系统之一是64位而另一个是32位,那么这将解释您看到的结果。