• <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>

            loop_in_codes

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            使用memcmp比較兩個變量結果一定嗎?

            參考Is using memcmp on array of int strictly conforming?

            以下代碼一定會輸出ok嗎?

            #include <stdio.h>
            #include <string.h>
            
            struct S { int array[2]; };
            
            int main () {
                struct S a = { { 1, 2 } };
                struct S b;
                b = a;
                if (memcmp(b.array, a.array, sizeof(b.array)) == 0) {
                    puts("ok");
                }
                return 0;
            }
            

            我在vs2005以及gcc4.4.3上做了測試,都輸出了ok。但這并不意味這個代碼會永遠輸出ok。問題主要集中于這里使用了賦值語句來復制值,但卻使用了memcmp這個基于內存數據比較的函數來比較值。

            c語言中的賦值運算符(=)被定義為基于值的復制,而不是基于內存內容的復制。

            C99 section 6.5.16.1 p2: In simple assignment (=), the value of the right operand is converted to the type of the assignment expression and replaces the value stored in the object designated by the left operand.

            這個其實很好理解,尤其在不同類型的數字類型間復制時,例如:

            float a = 1.1;
            int b = a;
            

            因為浮點數和整形數的內存布局不一樣,所以肯定是基于值的一種復制。另外,按照語言標準的思路來看,內存布局這種東西一般都屬于實現相關的,所以語言標準是不會依賴實現去定義語言的。

            上面的定理同樣用于復雜數據類型,例如結構體。我們都知道結構體每個成員之間可能會有字節補齊,而使用賦值運算符來復制時,會不會復制這些補齊字節的內容,是語言標準未規定的。這意味著使用memcmp比較兩個通過賦值運算符復制的兩個結構體時,其結果是未定的。

            但是上面的代碼例子中,比較的其實是兩個int數組。這也無法確認結果嗎?這個問題最終集中于,難道int也會有不確定的補齊字節數據?

            C99 6.2.6.2 integer types For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. […] The values of any padding bits are unspecified.

            這話其實我也不太懂。一個有符號整數int,其內也有補齊二進制位(bits)?

            但無論如何,這個例子都不算嚴謹的代碼。人們的建議是使用memcpy來復制這種數據,因為memcpy和memcmp都是基于內存內容來工作的。

            posted on 2012-08-17 14:07 Kevin Lynx 閱讀(3964) 評論(2)  編輯 收藏 引用 所屬分類: c/c++ 、tips

            評論

            # re: 使用memcmp比較兩個變量結果一定嗎? 2012-08-18 00:59 路過

            我還一直以為默認賦值運算就是內存賦值是標準內容呢,原來是未定義。  回復  更多評論   

            久久香蕉综合色一综合色88| 亚洲人成伊人成综合网久久久| 久久综合香蕉国产蜜臀AV| 国内精品综合久久久40p| 久久香蕉超碰97国产精品| 久久精品国产亚洲沈樵| 国内精品伊人久久久久网站| 久久久这里有精品| 久久久久久国产精品免费无码| 91久久香蕉国产熟女线看| 亚洲国产成人久久精品99| 国产午夜久久影院| 狠狠色噜噜色狠狠狠综合久久 | 国内精品久久久久久野外| 久久久久亚洲AV无码去区首| 日产精品久久久久久久| 久久天天日天天操综合伊人av| 亚洲AV无码久久精品狠狠爱浪潮| 伊人久久综在合线亚洲2019| 无码AV中文字幕久久专区| 久久久久国产视频电影| 久久精品国产99国产精品澳门 | 国产精品久久久久影院嫩草| 久久综合九色欧美综合狠狠| 嫩草影院久久国产精品| 久久久久久久亚洲Av无码| 国产精品久久久久免费a∨| 国产成人综合久久久久久 | 国产精品久久久久一区二区三区 | 久久精品国产亚洲一区二区三区 | 狠狠色丁香婷婷综合久久来| 久久精品日日躁夜夜躁欧美| 亚州日韩精品专区久久久| 国产精品伊人久久伊人电影 | 久久精品中文无码资源站| 亚洲午夜久久久影院伊人| 波多野结衣AV无码久久一区| 香蕉久久夜色精品国产尤物| 国产欧美一区二区久久| 国产精品99久久久久久人| 色天使久久综合网天天|