c++ - 数组的大小的问题
天蓬老师
天蓬老师 2017-04-17 14:48:36
0
2
538
#include <iostream>

using namespace std;

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

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

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(2)
巴扎黑

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

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

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

大家讲道理

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
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板