搜索
bottom↓
回复: 12

请教数组局部变量非固定长度定义导致的奇怪现象

[复制链接]

出5入0汤圆

发表于 2022-12-1 14:41:30 | 显示全部楼层 |阅读模式
本帖最后由 gnail092 于 2022-12-1 15:41 编辑

这个是二维码生成源码QRCode,调试发现显示出来的二维码,手机扫码识别不了,搞了好几天才查到原因,一直以为是显示的问题,最后跟踪二维码生成库的源码发现个奇怪的问题,源码中qrcode_initBytes()函数定义数组的几个局部变量采用非固定长度的方式,以下几个图片说明现象,isFunctionGridBytes[]这个数组变量的地址被定义在0x00起始地址,这是什么操作,这不是FLASH的地址吗,所以后面无法清除该变量跟这个有关系。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入57汤圆

发表于 2022-12-1 15:28:59 | 显示全部楼层
编译不报错吗,编译器不应该知道长度啊。
应该用malloc()

出0入4汤圆

发表于 2022-12-1 15:36:11 | 显示全部楼层
leafstamen 发表于 2022-12-1 15:28
编译不报错吗,编译器不应该知道长度啊。
应该用malloc()
(引用自2楼)

C99支持变长数组

出5入0汤圆

 楼主| 发表于 2022-12-1 15:36:21 | 显示全部楼层
leafstamen 发表于 2022-12-1 15:28
编译不报错吗,编译器不应该知道长度啊。
应该用malloc()
(引用自2楼)

这是网上找的二维码库的源码,用的很多的,就这么定义的

出0入16汤圆

发表于 2022-12-1 16:19:35 | 显示全部楼层
单片机里一般不要在函数里面定义大数组,容易堆栈溢出各种异常,单片机还是适合一个萝卜一个坑的做法

出300入477汤圆

发表于 2022-12-1 16:22:06 来自手机 | 显示全部楼层
yunqing_abc 发表于 2022-12-1 15:36
C99支持变长数组
(引用自3楼)

变长数组基本上相当于alloca,也就是在当前的堆栈上分配。对单片机来说这通常是坑人的,你的堆栈不会有多大的。

出0入475汤圆

发表于 2022-12-1 16:23:33 来自手机 | 显示全部楼层
初音之恋 发表于 2022-12-1 16:19
单片机里一般不要在函数里面定义大数组,容易堆栈溢出各种异常,单片机还是适合一个萝卜一个坑的做法 ...
(引用自5楼)

看来还是我等不会c语言这样高级那样宏的,遇到这种直接全局变量搞定,

出1310入193汤圆

发表于 2022-12-1 16:29:56 | 显示全部楼层

估计是栈这里出问题   
会出现奇奇怪怪现象

出5入0汤圆

 楼主| 发表于 2022-12-1 16:32:44 | 显示全部楼层
redroof 发表于 2022-12-1 16:22
变长数组基本上相当于alloca,也就是在当前的堆栈上分配。对单片机来说这通常是坑人的,你的堆栈不会有多 ...
(引用自6楼)

我这个现象是什么原因造成的,变长数组在我这个应用里是没有超过堆栈的,我改成固定分配的250字节更大

出5入0汤圆

 楼主| 发表于 2022-12-1 16:34:55 | 显示全部楼层
lb0857 发表于 2022-12-1 16:29
估计是栈这里出问题   
会出现奇奇怪怪现象
(引用自8楼)

跟栈没关系的,变长数组时我跟踪进去看了只分配了200左右字节长度,我改成定义成250字节的局部变量就没这个问题了

出0入16汤圆

发表于 2022-12-1 17:12:41 | 显示全部楼层
gnail092 发表于 2022-12-1 16:34
跟栈没关系的,变长数组时我跟踪进去看了只分配了200左右字节长度,我改成定义成250字节的局部变量就没这 ...
(引用自10楼)

malloc失败也是0x00, 动态内存申请是在堆上的,临时变量是在栈上的

出15入178汤圆

发表于 2022-12-1 20:11:49 | 显示全部楼层
蹭前面的分析:isFunctionGridBytes == NULL

出5入0汤圆

 楼主| 发表于 2022-12-1 20:16:35 | 显示全部楼层
初音之恋 发表于 2022-12-1 17:12
malloc失败也是0x00, 动态内存申请是在堆上的,临时变量是在栈上的
(引用自11楼)

变长数组并不等同于malloc,还是在栈上分配的,再说启动文件的Heap_Size也已经设置为0x200了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 17:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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