[英]C++ Reference to local variable vs reference to parameter
我正在編寫我自己的htonl,htons,ntohl和ntohs函數,我得到的行為我不明白。 以下代碼按預期工作:
uint16_t htons(uint16_t hostshort)
{
uint16_t netshort = 0;
uint8_t* p = (uint8_t*) (&netshort);
p[0] = (uint8_t)((hostshort & 0xFF00) >> 8);
p[1] = (uint8_t)((hostshort & 0x00FF) >> 0);
return netshort;
}
uint16_t ntohs(uint16_t netshort)
{
uint16_t hostshort = 0;
uint8_t* p = (uint8_t*) netshort;
hostshort |= ((uint16_t)p[0]) << 8;
hostshort |= ((uint16_t)p[1]) << 0;
return hostshort;
}
問題是這段代碼根本不起作用:
uint16_t htons(uint16_t hostshort)
{
uint16_t netshort = 0;
uint8_t* p = (uint8_t*) netshort;
p[0] = (uint8_t)((hostshort & 0xFF00) >> 8);
p[1] = (uint8_t)((hostshort & 0x00FF) >> 0);
return netshort;
}
uint16_t ntohs(uint16_t netshort)
{
uint16_t hostshort = 0;
uint8_t* p = (uint8_t*) (&netshort);
hostshort |= ((uint16_t)p[0]) << 8;
hostshort |= ((uint16_t)p[1]) << 0;
return hostshort;
}
當我從htons中刪除&netshort時,它返回所有零,當我在ntohs中添加它時,它返回垃圾。 有人可以解釋他們的處理方式有何不同? 我的理解是兩個案例都應該返回一個指向內存中數據開頭的指針,但顯然它們的處理方式不同。 參數是否隱式發生了什么?
uint16_t netshort = 0;
uint8_t* p = (uint8_t*) netshort;
這就是說,取netshort的值(即0
),並將其解釋為uint8_t*
指針。 在這種情況下,那將是null。
這意味着未定義以下行,為該指針指定內容。
p[0] = (uint8_t)((hostshort & 0xFF00) >> 8);
p[1] = (uint8_t)((hostshort & 0x00FF) >> 0);
您需要獲取當地的地址。
uint8_t* p = (uint8_t*) &netshort;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.