获取当前程序运行时的栈大小[C语言]

废话前言

一晃已经毕业了4年,也在某个时间点,从面试者转变成了面试官。

进行第一次面试的时候,我好像比候选人还慌张,压根不知道问什么,好在是同行业,看着简历问了一些协议内容以及模块设计思路,觉得没问题就直接给通过了。也许就是这样问的太简单了,候选人放弃了后面的面试,蛮失望的,以前都是拒别人offer,现在被别人拒。

后面的很多面试,都用这样的方法(行业基础外加一点嵌入式基础之类的问题)来判断候选人的技术能力。直到真的等到有候选人进公司,我才发现,把简历背熟,把bing一下出来的嵌入式题目背熟的菜鸡,不在少数。

于是我开始反思,到底是我的问题还是面试者的问题。我认为对于读了四年大学,还有一两年工作经验的人,基础应该不会太烂才对,即使没有看过除了工作外的代码,那至少也应该是有计算机思维的才是,不应该写不出代码的同时,还说不出思路。

于是,在后面的面试上,不管多久经验的,我都开始问一些不在嵌入式面试大全里的问题,来看下候选人的思维,以及从他们那儿学一些思路。

借最近看到同事写的栈溢出BUG,想到了这个获取当前程序运行时的栈大小面试题目,结果一搜就发现网上早都流传了,不过词条没有很多,也就是说还有价值。

这里只写两种思路,也比较通用,肯定是还有更好的办法的,这个就等下次面试时让候选人给出了。

正题开始

都是利用栈溢出的机制来推断栈大小。

第一种思路:二分法,手动申请足够大的局部数组,直到程序崩掉,数组大小基本就是栈大小。这个办法比较笨,得敲好久,于是衍生出第二种。

第二种思路:递归,递归函数里开辟个局部数组,记录第一层递归的数组地址和崩掉时那层的数组地址,地址相减可以得到大致的栈大小。

c 复制代码
uint64_t low_addr  = UINT64_MAX;
uint64_t high_addr = 0;
void endless_itr()
{
	char data[32];
	if (low_addr > (uint64_t)data) {
		low_addr = (uint64_t)data;
	}
	if (high_addr < (uint64_t)data) {
		high_addr = (uint64_t)data;
	}

	printf("stack size:%lld[byte](%lld[KB])\n", high_addr - low_addr, (high_addr - low_addr) / 1024);
	endless_itr();
}

int main()
{	
	endless_itr();
	return 0;
}

执行结果

结尾

这是在visual studio下的运行结果,vs默认栈大小时1MB(改成了2MB),这里附下更改vs工程栈大小的方法,可能有用。

相关推荐
简单电磁炮36 分钟前
关于can的调试
c语言·stm32·单片机
超级架构师1 小时前
让 COBOL 长出 AI 大脑:原生 Agent 核心框架 praxo-core 深度剖析
c语言·开发语言·c++·人工智能·python·架构·ai编程
·present·1 小时前
CSAPP(lecture 10)
c语言·c++
邪修king3 小时前
Re:Linux系统篇(三十八):进程间通信ChapterSystem V 信号量深度解析|同步互斥、内核源码、C 指针多态、实战代码
java·linux·c语言
IT规划师3 小时前
MQTT实战 - MQTT高频面试题 + 我的8年实战答案(十一)
物联网·mqtt·面试·.net core·iot·mqttnet
学逆向的12 小时前
C 堆区内存管理
c语言·开发语言·网络安全
阿尼卡~14 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
考研保研资料分享15 小时前
四非会计保研中国矿大(北京):七场考核、候补与择校复盘
面试
xiangyun6119 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
飞猫的边缘AI20 小时前
MCU面试开放题
人工智能·mcu·面试·求职招聘·flash·ram·边缘ai