• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            C++中結構體的字節對齊問題 ---- 轉

             

              前不久,在C++程序中碰到一個有關結構體字節對齊的問題。

            一。問題描述

            在程序中,定義了一個結構體,如下:
            typedef struct
            {
               char name[33];
               int ID;
               int  age;
            } PERSON;

            聲明了一個該結構體的數組:
            PERSON peo[30];

            當從結構體中取出ID字段給一個int類型的局部變量賦值時,卻出現異常.
            比如結構體中的字段都已經有初始值
            peo[0].ID =4;

            下面的賦值語句
            int tempID = peo[0].ID;
            卻不能正確得到數值4,tempID得到的是67108864.
            經檢查67108864是4在高位時的數值大小.
            賦值時本來應該是取內存中的四個Bytes:"04 00 00 00"
            可是取值時卻是用"00 00 00 04" 的方式.
            在調試過程中,從peo[0].ID取值是正確的,得到數字4,可程序執行上面賦值語句后:
            tempID還是得到的是67108864.

            也就是說,在調試器中取值是正確的,匯編后的程序取值卻是不正確的.
            程序在開始用了的很長一段時間并沒有出現這種問題,這個問題是最近才發生的.
            真是百思不得其解。還有一點是明確的,程序涉及到網絡傳輸。

            可是如果把結構體中的字符數組大小由33改為36,一切正常了!

            原理上肯定是結構體的位對齊問題,但為什么以前編譯使用沒出問題,現在編譯才發生呢?
            應該怎么解決呢?

            二。尋找問題的原因。

            經過CSDN社區各位老大的幫助,并且自己仔細去了解程序中的編譯條件部分,原則上理解了這問題的本質所在。

            發現在網絡模塊中使用到了"#pram pack(1)"這樣的編譯條件,而其它模塊則沒有加入這種編譯條件。

            而CSDN中其中一個大蝦是這樣解釋的:“對齊方式是給編譯器看的,編譯器根據這個來決定內存布局。一旦編譯成二進制文件內存布局就已經確定了,如果兩段代碼對同一個結構使用的對齊方式不同,那么就會對內存里的值做出了不同的解釋,賦值的一方認為char[33]占了36個字節,從第37個字節填寫04 00 00 00,可是讀取的一方認為char[33]只有33個字節,那就從第34個字節處取四個字節當作ID。”

            這次網友的解釋,我認為指出了問題的本質所在:“如果兩段代碼對同一個結構使用的對齊方式不同,那么就會對內存里的值做出了不同的解釋”。我們的程序給結構體初始化部分是按VC編譯器中默認的結構體8字節對齊,而在網絡模塊中,由于使用了"#pram pack(1)",結果從結構體中取值時,編譯器認為結構體是按1字節對齊,最終導致了問題的產生。

            三。解決方法

            為了解決這個問題,就需要程序中所有的代碼對同一個結構體都使用同一種對齊即可。

            會有兩種解決辦法:
            一是把網絡模塊中的"#pram pack(1)"去掉,結構體都是按VC編譯器中默認的結構體8字節方式對齊。
            二是設置結構體按1字節方式進行對齊,程序所有模塊都按這種對齊方式編譯。

            設置在VC的"project"->"setting..."->"c/c++":struct member aligment改成1 Bytes.

            posted on 2008-11-05 23:30 大龍 閱讀(1966) 評論(0)  編輯 收藏 引用

            人妻无码精品久久亚瑟影视| 色欲av伊人久久大香线蕉影院| 国产精品99精品久久免费| 国产精品久久久久久久久鸭| 香蕉久久一区二区不卡无毒影院| 久久人人爽人人爽人人片AV东京热 | 午夜天堂av天堂久久久| 成人妇女免费播放久久久| 久久亚洲国产精品五月天婷| 99久久99这里只有免费费精品| 久久93精品国产91久久综合| 人妻精品久久久久中文字幕69| 久久久亚洲精品蜜桃臀| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 热久久国产欧美一区二区精品| 97精品依人久久久大香线蕉97 | 久久亚洲2019中文字幕| 99久久99久久| 性欧美大战久久久久久久久| 亚洲精品国产自在久久| 国产99久久久久久免费看| 久久精品亚洲中文字幕无码麻豆| 一本久久免费视频| 久久性精品| 九九热久久免费视频| 欧美久久综合性欧美| 日韩精品久久久久久免费| 久久亚洲精品无码aⅴ大香 | 久久精品综合一区二区三区| 日韩精品久久久久久| 久久91精品国产91久久小草| 久久久久亚洲av无码专区导航| 精品久久久中文字幕人妻| 精品伊人久久久| 99久久做夜夜爱天天做精品| 伊人色综合久久天天网| 亚洲国产成人精品91久久久| 色欲综合久久躁天天躁| 久久亚洲精品国产精品婷婷| 天堂无码久久综合东京热| 久久天天躁夜夜躁狠狠躁2022 |