2016-07-24 28 views
0

我得到了下面的代碼,它在網絡上需要一個131字節的緩衝區,並將解碼後的值存儲到結構中的元素中,但對於第一個元素protocol_version,我將該值設置爲緩衝區中的元素,但無法將protocol_version的值設置爲緩衝區中的第一個元素。該結構如下:結構元素的值在返回之前設置,但不是在返回時設置

typedef struct { 
    short protocol_version; 
    char username[64]; 
    char verification_key[64]; 
    char unused; 
} player_identification; 

和代碼是在這裏:

player_identification *parse_player_identification(char *buffer) { 
    player_identification *pkt = malloc(sizeof(player_identification)); 
    pkt->protocol_version = buffer[0]; 
    printf("0x0%x\n", pkt->protocol_version); // THIS PRINTS OUT 0x07 WHICH IS CORRECT! 

    char buf[64]; 
    for(int i = 0; i < 64; i++) { 
      buf[i] = buffer[i + 1]; 
    } 
    buf[64] = 0; 
    strcpy(pkt->username, trim_whitespace(&buf)); 

    char buf2[64]; 
    for(int i = 0; i < 64; i++) { 
      buf2[i] = buffer[i + 1 + 64]; 
    } 
    buf2[64] = 0; 
    strcpy(pkt->verification_key, trim_whitespace(&buf2)); 

    pkt->unused = buffer[130]; 
    return pkt; 
} 

注意我怎麼把它打印出來,它打印的0x07的值,它是一個常量,buffer[0]總是會,但它始終是0x00。對於GDB,它指出指針是0x00(null),所以我無法讀取內存地址的內容。有任何想法嗎?

+0

任何你沒有驗證你的函數的* end *字段的原因?剝離所有內存緩衝區馬戲團的作用,只留下'protocol_version'分配。檢查結果。如果它是正確的,開始添加回來。我的猜測是你在拷貝和覆蓋你的版本字段時正在通過你的字符緩衝區。由於我們沒有提供[最小,**完整**,可驗證的示例](https://stackoverflow.com/help/mcve),猜測是關於您將得到的所有內容。 (順便提一下,這給其他人學習一個*可怕的問題)。 – WhozCraig

+0

@WhozCraig,在註釋掉兩個字符串操作的馬戲團行爲之後,我實際上正確設置了'protocol_version'。我的兩個字符串函數可能覆蓋版本字段有什麼問題? – mhsjlw

+2

btw,'buf [64] = 0;'和'buf2 [64] = 0;'都調用*未定義的行爲*。這些緩衝區都只能通過0..63進行下標。 – WhozCraig

回答

1

這兩種:

buf[64] = 0; 
.... 
buf2[64] = 0; 

調用未定義行爲。這些緩衝區只有64元素寬。 C中的大小爲N的本地數組可以從0 ...(N-1)中下標。這兩個陳述都寫了一個元素,然後你的程序剩下的行爲留給仙子。