首頁  >  問答  >  主體

c++ - 数组的大小的问题

#include <iostream>

using namespace std;

int main()
{
    char*a[]={"zzzz","zz","zzzzzzz"};
    cout << sizeof(a) << endl;
    return 0;
}

为什么输出是24呢?为什么数组的大小不是5 + 3 + 8 = 16呢?

天蓬老师天蓬老师2713 天前483

全部回覆(2)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 14:50:36

    a存放的是三個字串常數的位址,並不是直接存放3個字串,一個位址也就是一個指標

            |----------| 
            |  xxxxxx  |       
            |----------|        |--------|
     a -->  | pointer1 | -----> | "zzzz" |
            |----------|        |--------|      |------|
            | pointer2 | ---------------------> | "zz" |
            |----------|        |-----------|   |------|
            | pointer3 | -----> | "zzzzzzz" |
            |----------|        |-----------|
            |   xxxxx  | 
    sizeof(a) == 3 * sizeof(pointer) = 24

    如果你是32位元作業系統,則指標長度是4位元組,64位元是8位元組,可以推算出你的編譯環境是64位元的

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:50:36

    C/C++ 的聲明並不能從左往右閱讀,而是要先找到標識符,遊標向右,待右側沒有東西時,遊標向左,待左側沒有東西時,進入上一層括號重複第一步,待沒有上一層括號時,結束。 [1]

    也就是說,char* a[] 意味著,

    a is an array of pointers to char's

    當使用字串字面量初始化 char* 時,該指標變數中存放的是字串常數在記憶體中的位址。

    這也就是說,

    sizeof(a) == 3 * sizeof(char*)

    在 64-bit 系統中,

    sizeof(char*) == 8

    所以

    sizeof(a) == 24

    另外,C/C++ 中的陣列的大小,恆等於陣列中單一元素的大小乘以陣列中元素的個數

    這也就是說,無論何時,計算數組的大小,都不會出現幾個不相等的數相加的情況。

    如果你希望一個變數佔用的記憶體空間等於其中各部分總和,可以這樣寫:

    #include <stdio.h>
    
    int main() {
      struct a {
        char a[5];
        char b[3];
        char c[8];
      } a = {"zzzz", "zz", "zzzzzzz"};
    
      printf("%lu\n", sizeof(a)); // 16 = 5 + 3 + 8
    }
    

    回覆
    0
  • 取消回覆