OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6096|回复: 0

[求助]如何判断堆栈空间是否溢出?(堆栈溢出导致C库函数玄学错误)

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-10-24
在线时间
7 小时
发表于 2021-5-2 22:32:28 | 显示全部楼层 |阅读模式
1金钱

strtoul这个函数是将字符串转换为数字的一个函数,使用以下代码在空项目测试以后
发现可以正常转换 即 num2被转换成了1234。

//测试环境
void fun(){
unsigned long num2=0;
char numlocation[25]="1234";
num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);
}

装入实际工程以后,发现stroul这个函数开始犯病,出现了一个玄学错误。代码如下
void fun2(){
unsigned long num2=0;
unsigned long num3=0;
char numlocation[25]="1234";
char numlocation2[25]="2234";
num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);
num3=(unsigned long)strtoul((const char *)numlocation,NULL,10);
}

结果发现num3转换正常,num3=2234,但是num2 得出的结果是num2=234,即首位的1莫名奇妙的丢了,当我把要转换的字符串改为"1123"时,发现转换后的数字
为23,即位于数组前面的多个1都不能被转换,但是当我把要转换的字符串改为"2123"时,即字符串首位不为1时,num2竟然又转换正常了。


百思不得其解研究了2小时发现,在真实环境下的代码实际是这样的
void fun2(){
unsigned long num2=0;
char numlocation[25]="1234";
//位置1
char otherstring[2000]={};                      //中间夹杂了别的数组
//位置2
}

发现num2=(unsigned long)strtoul((const char *)numlocation,NULL,10);这句话放在位置1,则转换正常,放在位置2,则转换出错,错误如上。
故考虑是否是某些空间不足导致,因为需求原因,临时变量申请的比较多,故更改了启动文件的堆栈大小的定义,扩大了堆栈区,最终终于转换正确。

自己是个新手 总结了几个问题想问问大家:
1.为何堆栈空间不足会导致stroul函数出现莫名其妙的问题?
2.为了保证代码运行正确,堆栈区的大小应该怎么设置?设置成多少?如果空间不够,应该如何查看?
3.楼主之所以要开辟大空间的临时变量,是因为要完成一个文件读写的问题:我需要读一个几百字的txt,从中间找到我需要的一个特定字符串的位置,更改部分内容,再写回原位置,我的思路是直接把整个文件读
到一个数组中,然后再判断,所以我需要开辟一个大空间的临时变量,各位有没有什么好办法,让我可以每次读少点内容,还可以定位到我的特定字符串位置?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 15:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表