1

重複の可能性:
Cプログラミング言語の配列のサイズ?

charf1という関数から別の関数f2に配列を渡します。関数f1で、を使用してそのサイズを出力しています。sizeof結果は。になり9ます。2番目の関数では、上記と同じステートメントを使用してそのサイズを再度出力していますが、今回は結果が8。実際、2つの値を出力する間にこの配列を使用していません。別のラップトップで同じコードを実行しようとすると、2番目の関数の結果になります4

この質問から、なぜ私が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
4

2 に答える 2

6

配列を関数に渡すと、最初の要素へのポインターとして減衰します。
関数内で受信パラメーターに適用するsizeofと、配列のサイズではなく、ポインターのサイズ(その環境内)を取得します。

関数内の配列のサイズが必要な場合は、追加の関数パラメーターとして渡すだけです。

于 2012-12-26T14:33:24.687 に答える
0

ポインタのサイズは、アーキテクチャ間で、または同じアーキテクチャ内(ハーバードアーキテクチャなど)でも異なる可能性があります。

一般的なデスクトップシステム(Windows、Linux、またはOS Xを実行するx86)の場合、64ビットバージョンのOSには8バイトのポインターが必要ですが、32ビットバージョンには4バイトしか必要ありません。したがって、実行しているシステムの1つが64ビットで、もう1つが32ビットの場合、それはあなたが見た結果を説明します。

于 2012-12-26T15:35:52.217 に答える