#include <iostream>
using namespace std;
int main()
{
char*a[]={"zzzz","zz","zzzzzzz"};
cout << sizeof(a) << endl;
return 0;
}
为什么输出是24
呢?为什么数组的大小不是5 + 3 + 8 = 16
呢?
巴扎黑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位元的
大家讲道理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
}