面试前虽然复习了一部分内容,但是还是对面试官故意下套的行为表示很伤心。。。。
---- 后来才发现这些都是实际业务中最基本的问题,必须全部掌握。
1.
char *p = "Hello";
int n = sizeof(p);
// 问:32位机器上,n等于几?
答案是:4
这就是一个陷阱,这个跟字符串啊 '\0'啊根本就没关系,因为p是个指针,指针就是4个字节。
但是,如果问题是:
char p[] = "Hello";
int n = sizeof(p);
// 问:32位机器上,n等于几?
那么,由于字符串结尾的'\0'的问题,答案就是 6。
2. 结构体和联合体
我表示联合体就没有做过应用,早忘到一边去了。
struct s
{
int a;
int b;
char c;
int d;
}SS;
union u
{
int a;
int b;
char c;
int d;
}UU;
// 问:32位机器上sizeof(SS), sizeof(UU) 分别是多少?
答案是:16 4
按照默认的四字节内存对齐,那么第结构的变量c后面会有三个字节的补齐,所以结构体一共是16个字节。
而联合体是共享的,所以联合体的大小应该是最宽变量的大小,并且要符合所有变量的内存对齐规则,则联合体大小为4.
如果上面的内容在变一下:
struct s
{
int a;
int b;
char c;
int d;
char e[5];
}S2;
union u
{
int a;
int b;
char c;
int d;
char e[5];
}U2;
// 问:32位机器上sizeof(S2), sizeof(U2) 分别是多少?
答案为:24 8
前面的大小都是不变的,但是数组大小为5,仍然按照四字节对齐的话,char e[5]将占8个字节,所以sizeof(S2) = 16 + 8 == 24;
而联合体当然就是8了。
不知道面试官为什么那么爱问sizeof, 感觉这个关键字用的不是很多啊!
---- 如果是C语言的开发项目,不可避免的有很多内存操作,sizeof作为获取变量/结构占用内存大小的基本关键字,使用场景多而复杂,在函数调用关系复杂之后,很容易出现将指针、数组、结构体、联合体计算大小时出错的场景。要知道一个踩内存的问题带来的定位成本是以指数倍提升,深入理解这些基本操作是C语言程序员亲身感悟的痛。