結構體中慎用指標

來源:互聯網
上載者:User

 

 轉載請註明出處

作者:小馬


今天寫一個基於TCP/IP的資料包發送程式時, 遇到一個問題, 我發送了一個資料包過去, 服務端可以接收到,但接收到的資料長度小於我實際傳送的資料長度. 這個bug調了很久, 開始還認為是伺服器端的程式問題, 最終發現是栽在了指標上面.

 

發送資料包的包格式形如下面的定義:

typedef struct _TestStruct{         char testA[5];         char *pTest;         char testC[4];}TestStruct_s;

 

因為,pTest域的大小是可變的, 需要動態分配. 所以我把它置成指標. 然後我對資料包賦值

TestStruct_s testData;memcpy(testData.testA, "abcde", 5);testData.pTest = (char *)malloc(sizeof(char)*3);memcpy(testData.pTest, "fgh", 3);memcpy(testData.testC, "ijkl", 4);

 

接著調用一個socket發送函數把這個包發送出去, 該函數接收兩個參數, 一個要發送的字串緩衝區,一個是緩衝區長度. 所以我先把組好的資料包複製到一個臨時緩衝區裡.

 

 
char sendBuffer[1024] = {0};char sendLen = 12;memcpy(sendBuffer, &testData, sendLen); //這一步出現了致命的錯誤. 

我想當然的以為sendBuffer應該是”abcdefghijkl”了, 所以我調用socket_send函數發送資料到伺服器.

socket_send(sendBuffer, sendLen);

 

相信高手應該已經看出來我的問題在哪裡了. 因為memcpy是複製連續的記憶體, 但是testData的資料並不是連續的, 因為pTest域是

testData.pTest = (char *)malloc(sizeof(char)*3)動態分配的.

單步跟一下記憶體如所示:

 

0x0012fb80是sendBuffer的記憶體位址, 可以看出, 到第三個CC後面的00,sendBuffer就已經束了, 因為字串是以0x00結尾的,
memcpy在執行的時候, 只複製到這裡就結束了.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.