面试官爱给咱下的套 C/C++

面试前虽然复习了一部分内容,但是还是对面试官故意下套的行为表示很伤心。。。。

---- 后来才发现这些都是实际业务中最基本的问题,必须全部掌握。

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语言程序员亲身感悟的痛。






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值