#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++ 中的数组的大小,恒等于数组中单个元素的大小乘以数组中元素的个数
这也就是说,无论何时,计算数组的大小,都不会出现几个不相等的数相加的情况。
如果你希望一个变量占用的内存空间等于其中各部分之和,可以这样写: