簡體   English   中英

C ++對局部變量的引用與對參數的引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM