今天贩据,同事為了讓代碼數(shù)據(jù)正確顯示到界面上留特,要求我通過udp服務(wù)器發(fā)送參數(shù)設(shè)置給界面,我的主機是小端模式,對方是大端接收葱绒。本來想模擬一組數(shù)據(jù)發(fā)送過去試一試善涨。結(jié)果發(fā)現(xiàn)得給他 轉(zhuǎn)換字節(jié)序分苇,于是發(fā)現(xiàn)了如下全局變量賦值的問題彤蔽。由于是測試數(shù)據(jù),最后就用不大于F的數(shù)進行模擬了挑社。記錄如下:
結(jié)構(gòu)體初始化 initializer element is not constant
1. 例子
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
typedef struct
{
unsigned int ulRecvPara;
unsigned int ulSendPara;
unsigned char ucSwitch;
}SETSYSPARA_ST;
SETSYSPARA_ST stParrRight ={
.ulRecvPara = 0x10,
.ulSendPara = 0x20,
.ucSwitch = 0x1,
};
/*結(jié)構(gòu)體初始化錯誤典型如下
SETSYSPARA_ST stParaError = {
.ulRecvPara = htonl(0x10),
.ulSendPara = htonl(0x20),
.ucSwitch = 0x1,
};
*/
int main(int argc, char**argv)
{
return 0;
}
2.分析
全局變量是保存在靜態(tài)存儲區(qū)的陨界,因此在編譯的時候只能用常量進行初始化,而不能用變量進行初始化痛阻。全局變量的內(nèi)存地址直接存儲變量的值菌瘪。在該程序中是用函數(shù)htonl的返回值給結(jié)構(gòu)體成員進行初始化的,因此會出錯.initializer element is not constant
阱当。
htonl()函數(shù)實現(xiàn)主機字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序(大端字節(jié)序)俏扩;
總結(jié):
- 全局變量是保存在靜態(tài)存儲區(qū),只能用常量進行初始化
- 局部變量,初始化可常量斗这,變量賦值