吃虧在四位元組對齊

2021-04-29 17:57:30 字數 1071 閱讀 8668

吃虧在四位元組對齊

我在寫程式的時候遇到乙個問題,費了我半天的時間才找到答案,記錄如下:

我原來乙個程式有如下結構:

uchar rx_buf[max_buf];

typedef struct       //本結構體保證四位元組對齊

protocol;

//程式片斷

protocol *proto;

…for(i=0; itx_buf[i] = rx_buf[i];

*proto = (protocol *)tx_buf;

make_ack(proto, rx_buf, tx_buf);

…// make_ack函式實現

make_ack(proto, rx_buf, tx_buf)…}

就這麼一段程式,從邏輯上看任何問題沒有,但是就是讀取不到檔案,把我氣得呀!還以為是檔案系統出錯了,就開始找檔案系統的**,結果發現沒有問題。還作了測試。

然後我就懷疑是輸入引數錯了,掛wpe截獲傳送的資料,發現傳送的資料完全正確,寫測試**發現接受的資料完全正確。

於是乎,掛**器,並用串列埠輸出除錯資訊。

**修改如下:

// make_ack函式實現

make_ack(proto, rx_buf, tx_buf)

#ifdef output_debug_string

serialprintf(「proto->offset:%d」, proto->offset);

#endif…}

結果除錯執行結果:在除錯到proto->offset時顯示的資料為0,是我預期的結果,但是串列埠列印的資料確是:12636928。我一看傻眼了,還有這麼邪門。然後我就除錯到f_lseek函式內部,發現引數傳進來就給我改了位址了。呵呵,終於找到原因了,可是他娘的是怎麼回事呢?然後我就琢磨著可能是四位元組沒有對齊,於是乎就開啟了memory,發現果然tx_buf的起始位置是四位元組的中間,找編譯器的設定也沒找到,只要做了如下修改*proto = (protocol *)tx_buf;修改為*proto = (protocol *)rx_buf;反正資料一樣。

問題解決,搞定。但是還是很不爽。

四位元組記憶體對齊

首先我們先看看下面的c語言的結構體 typedef struct memalign memalign 以上這個結構體占用記憶體多少空間呢?也許你會說,這個簡單,計算每個型別的大小,將它們相加就行了,以32為平台為例,int型別佔4字節,char占用1字節,所以 4 3 4 11,那麼這個結構體一共占...

位元組對齊 8位元組對齊

參考博文 參考1 參考2 參考3 在記憶體管理中經常使用位元組對齊來管理分配的記憶體。1 原理 2 演算法 2.1unsigned intcalc align unsigned int n,unsigned align 2.2 更好的演算法 unsigned intcalc align unsign...

python 過濾四位元組字元 表情字元

專案中有時需要過濾掉四位元組以上的字元 表情 比如mysql資料庫5.5.3以下的版本text欄位不支援四位元組以上字元 於是就需要過濾掉再入庫,python中的方法為 try python ucs 4 build的處理方式 highpoints re.compile u u00010000 u00...