作者realmeat (念.力.寫.程.式)
看板C_and_CPP
標題Re: [問題] struct的data大小是可變的...
時間Wed Feb 25 22:59:13 2009
※ 引述《pougoar ()》之銘言:
: 假設我有個
: struct msg
: {
: int length;
: char data[n];
: };
: 我想讓data的大小是可變的
: 然後透過網路送出去
: 這樣不知道要怎麼做比較好阿?
: 我只知道可以用 dynamic allocate
: struct msg
: {
: int length;
: char *data;
: };
: msg->data= (char*)allocate(sizeof(char)*n);
: 1. 我很好奇 這樣動態的宣告data的大小會不會有問題阿?
: 2. 還有一個問題是此時的data放的是動態allocate到資料的位址
: 這樣我把msg傳出去
: 遠端的電腦收到這個data的指標也沒用阿
: 它也指不到這個動態的區域
: 所以我想請問到底怎麼宣告這個大小不一定的structure
: 且送出去的時候 遠端也可以順利的讀到這個structure
: 謝謝指教...
struct msg
{
int length; //4 bytes
char data[];
};
#define MSG_HEADER_SIZE (sizeof(struct msg))
這樣就是header長度為4 的作法
struct msg *msg_ptr = (struct msg*) malloc(length+MSG_HEADER_SIZE);
msg_ptr->length = length;
指向資料端 msg->data ,填入資料
然後把msg_ptr指過去的空間全都丟進封包
char packet_buffer[]; <--假設這是 封包接收到的地方
struct msg *msg_packet = packet_buffer;
長度為 msg_packet->length;
資料則在 msg_packet->data;
封包的東西最好在擺個crc 以免傳送出錯, 如果底層做好就免了
封包還是有大小限制, 接收的buffer一般都設定成最大size
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.64.60.201
※ 編輯: realmeat 來自: 210.64.60.201 (02/25 23:13)
推 pougoar:謝謝 我大概知道了 02/25 23:28
推 QQ29:抱歉請教一下 struct裡面包 char[] 我該怎麼給他直阿? 02/26 00:01
→ realmeat:就接在length的後面直接使用msg_ptr->data這位置 02/26 00:13
推 QQ29:那請問一下msg_packet = packet_buffer 這樣寫過的了嗎 02/26 00:16
→ realmeat:沒轉型還是可以硬接啦, 就跳個warning 02/26 00:47
→ realmeat:packet_buffer本身要有長度 我只是假設而已 02/26 00:48
推 QQ29:我用VC是不給我過 所以問問@@ 02/26 00:53
→ realmeat:那要轉型, 不然調warnning等級, VC限制比gcc多 =3=y-~ 02/26 00:55