指针式字符串字面量数组是否会像普通字符串数组一样浪费内存?
两种C语言字符串数组声明的内存浪费对比
先看两种声明的代码:
char* foo[] = { "bar", "foobar" };
char foo[2][7] = {"foo", "foobar"};
第二种声明的内存浪费原因
char foo[2][7]是固定大小的二维字符数组,它强制每个子数组都占用7字节内存。第一个字符串"foo"加上字符串终止符\0只需要4字节,但因为数组大小固定为7,剩下的3字节就被闲置了,这就是你提到的内存浪费。
第一种声明的内存情况
char* foo[]是指针数组,它的每个元素是一个指向字符串字面量的指针:
- 指针数组本身占用的内存是「指针大小 × 元素个数」(32位系统每个指针4字节,64位是8字节),这里2个指针就是8或16字节;
- 而每个字符串字面量是单独存储的:"bar"占4字节(3个字符+1个
\0),"foobar"占7字节(6个字符+1个\0),都是按需分配,没有多余的闲置空间。
所以第一种方式不会出现第二种那样的内存浪费,它不会强制所有字符串占用相同的固定内存,每个字符串只占用自身实际需要的字节数。
内容的提问来源于stack exchange,提问作者GrandeKnight
相关产品推荐
相关产品推荐

