今天学习C语言发现了以前的一些知识上的盲点,就记录下来。
printf("%d,%d\n", sizeof('A'), sizeof("A"));
这个代码打印的结果是 4,2
我去查了下资料这个'A'是integer character constant类型,其实就是我们自己所获得的ascii码。在三十二位的windows系统里int是4个字节所以打印的4,这里这个当成了int类型。
2是因为双引号会认为是字符串,所以在其后系统自动添加了'\0',所以其实是两个字符。
typedef struct strtype3 { char a; int b; } X3;
X3 a = { 1 ,'A' }; printf("%d\n", &a); printf("%d,%d\n", &a.a, &a.b);
//打印结果 14810844 14810844,14810848
这里可以看出属性a和属性b是相差了4个字节,但是a是char类型的明明是一个字节。
原来c语言有一个边界对齐的特点,就是这个属性的地址必须是4的倍数。所以这样就会有三个字节的地址空缺出来。
但是连续两个char类型的属性,这样就会有两个字节的地址空缺出来。
所以c语言结构体的属性最好可以合理安排,这样可以节省很多内存出来。