<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 緣由 最近在看redis的源碼,剛開始看sds,看到這塊代碼 ``` struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ char buf[]; }; ``` 好奇為什么使用 `char buf[]`,而不用`char *buf`,找到答案記錄一下。 ## struct中的char*和char數組有什么區別 常用來構成緩沖區。比起指針,用空數組有這樣的優勢: * 不需要初始化,數組名就是所在的偏移,當數組名作為函數參數的時候,也就是指向第一個元素的指針。 * 空數組不占用內存, 但是指針需要占用int長度的空間,不同平臺,占用大小不一樣。 * 內存連續性 * 分配內存時:如果使用空數組,則可以使用 `malloc(sizeof(structXXX) + buf_len)`的方式來分配一段連續的內存。`buf_len`可以直接作為 緩沖區的長度。但是如果使用的是指針,則需要額外的去給指針賦值。而此時的內存與結構體的內存已經不連續,要分別申請和釋放。 * 在釋放內存時,如果用數組,則一次性釋放;如果用的是指針,則需要先釋放struct中的指針,再釋放結構體,不可以顛倒。 >結構體中最后一個成員為`[1]`長度數組的用法:與長度為`[0]`數組的用法相同,改寫為`[1]`是出于可移植性的考慮。有些編譯器不支持`[0]`數組,可將其改成`[]`或`[1]`.一般使用`char []`. ## 代碼示例: ``` #include <stdlib.h> #include <stdio.h> struct __attribute__ ((__packed__)) t_char1 { char a; char b[]; }; struct __attribute__ ((__packed__)) t_char2 { char a; char* b; }; int main() { char a = 0; char a1[]={}; char *b = &a; t_char1 c; t_char2 d; printf("char: %d, char*: %d, char[]: %d\n", sizeof(a), sizeof(b), sizeof(a1)); printf("t_char1: %d, c.a: %p, c.b: %p\n", sizeof(c), &c.a, c.b); printf("t_char2: %d, d.a: %p, d.b: %p\n", sizeof(d), &d.a, d.b); } ``` >`__attribute__ ((__packed__))`的作用是為了取消內存對齊。 編譯輸出 ``` $ g++ -o test main.cc -std=c++11 $ ./test char: 1, char*: 8, char[]: 0 t_char1: 1, c.a: 0x7ffd906865b6, c.b: 0x7ffd906865b7 t_char2: 9, d.a: 0x7ffd906865a0, d.b: 0xa000000000004006 ``` 總結: * `struct t_char1`中空數組沒有分配內存,sizeof(c)-sizeof(a) = 1-1=0; `struct t_char2`中指針的內存占用了八字節 。 * 通過觀察得到,在`struct t_char1`中, 空數組雖然不占用內存,但是可以獲取結構體尾部的地址。 * 在結構體中更推薦使用`char`空數組。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看