1

Possible Duplicate:
Sizeof an array in the C programming language?

I am passing a char array from a function say f1 to another function f2. In function f1 I am printing its size using sizeof & it results in 9. In the second function I am again printing its size using the same statement as above but this time it results in 8. And infact I am not using this array in between printing the two values. When I tried to run the same code on a different laptop, for the second function it results 4.

It is clear from this question that why I am getting 4, but why I am getting 8 on another laptop.

Why this is happening?

My whole code is too big so I am sharing only the essential part: (Here the array about which I am talking is plid and I am calling the function login from the first function. I am not sharing the complete functions because of their length. logp, errorp.. these are my own written functions that are writing to a file, which I have shared in the end.)

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

logfile output:

__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
Community
  • 1
  • 1
Abhishek Gupta
  • 6,465
  • 10
  • 50
  • 82

2 Answers2

7

When you pass an array to the function it decays as the pointer to its first element.
When you apply sizeof inside the function on the receiving parameter you get the size of the pointer(in that environment) and not the size of array.

If you need the size of array inside the function, simply pass it as additional function parameter.

Alok Save
  • 202,538
  • 53
  • 430
  • 533
0

Pointer sizes can vary across architectures, or even within the same architecture (such as in a Harvard architecture).

For a typical desktop system (x86 running Windows, Linux, or OS X), a 64-bit version of the OS will need 8 byte pointers, whereas a 32-but version will only need 4 bytes. So if one of the systems you were running was 64-bit and the other was 32-bit, then that would explain the result you saw.

John Bode
  • 119,563
  • 19
  • 122
  • 198