#include <iostream> using namespace std; int main() { char*a[]={"zzzz","zz","zzzzzzz"}; cout << sizeof(a) << endl; return 0; }
为什么输出是24呢?为什么数组的大小不是5 + 3 + 8 = 16呢?
24
5 + 3 + 8 = 16
欢迎选择我的课程,让我们一起见证您的进步~~
a存放的是三個字串常數的位址,並不是直接存放3個字串,一個位址也就是一個指標
a
|----------| | 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[] 意味著,
char* a[]
a is an array of pointers to char's
當使用字串字面量初始化 char* 時,該指標變數中存放的是字串常數在記憶體中的位址。
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 }
a
存放的是三個字串常數的位址,並不是直接存放3個字串,一個位址也就是一個指標如果你是32位元作業系統,則指標長度是4位元組,64位元是8位元組,可以推算出你的編譯環境是64位元的
C/C++ 的聲明並不能從左往右閱讀,而是要先找到標識符,遊標向右,待右側沒有東西時,遊標向左,待左側沒有東西時,進入上一層括號重複第一步,待沒有上一層括號時,結束。 [1]
也就是說,
char* a[]
意味著,當使用字串字面量初始化
char*
時,該指標變數中存放的是字串常數在記憶體中的位址。這也就是說,
在 64-bit 系統中,
所以
另外,C/C++ 中的陣列的大小,恆等於陣列中單一元素的大小乘以陣列中元素的個數
這也就是說,無論何時,計算數組的大小,都不會出現幾個不相等的數相加的情況。
如果你希望一個變數佔用的記憶體空間等於其中各部分總和,可以這樣寫: