请教数组局部变量非固定长度定义导致的奇怪现象
本帖最后由 gnail092 于 2022-12-1 15:41 编辑这个是二维码生成源码QRCode,调试发现显示出来的二维码,手机扫码识别不了,搞了好几天才查到原因,一直以为是显示的问题,最后跟踪二维码生成库的源码发现个奇怪的问题,源码中qrcode_initBytes()函数定义数组的几个局部变量采用非固定长度的方式,以下几个图片说明现象,isFunctionGridBytes[]这个数组变量的地址被定义在0x00起始地址,这是什么操作,这不是FLASH的地址吗,所以后面无法清除该变量跟这个有关系。
编译不报错吗,编译器不应该知道长度啊。
应该用malloc() leafstamen 发表于 2022-12-1 15:28
编译不报错吗,编译器不应该知道长度啊。
应该用malloc()
(引用自2楼)
C99支持变长数组 leafstamen 发表于 2022-12-1 15:28
编译不报错吗,编译器不应该知道长度啊。
应该用malloc()
(引用自2楼)
这是网上找的二维码库的源码,用的很多的,就这么定义的 单片机里一般不要在函数里面定义大数组,容易堆栈溢出各种异常,单片机还是适合一个萝卜一个坑的做法 yunqing_abc 发表于 2022-12-1 15:36
C99支持变长数组
(引用自3楼)
变长数组基本上相当于alloca,也就是在当前的堆栈上分配。对单片机来说这通常是坑人的,你的堆栈不会有多大的。
初音之恋 发表于 2022-12-1 16:19
单片机里一般不要在函数里面定义大数组,容易堆栈溢出各种异常,单片机还是适合一个萝卜一个坑的做法 ...
(引用自5楼)
看来还是我等不会c语言这样高级那样宏的,遇到这种直接全局变量搞定,
估计是栈这里出问题
会出现奇奇怪怪现象
redroof 发表于 2022-12-1 16:22
变长数组基本上相当于alloca,也就是在当前的堆栈上分配。对单片机来说这通常是坑人的,你的堆栈不会有多 ...
(引用自6楼)
我这个现象是什么原因造成的,变长数组在我这个应用里是没有超过堆栈的,我改成固定分配的250字节更大 lb0857 发表于 2022-12-1 16:29
估计是栈这里出问题
会出现奇奇怪怪现象
(引用自8楼)
跟栈没关系的,变长数组时我跟踪进去看了只分配了200左右字节长度,我改成定义成250字节的局部变量就没这个问题了 gnail092 发表于 2022-12-1 16:34
跟栈没关系的,变长数组时我跟踪进去看了只分配了200左右字节长度,我改成定义成250字节的局部变量就没这 ...
(引用自10楼)
malloc失败也是0x00, 动态内存申请是在堆上的,临时变量是在栈上的 蹭前面的分析:isFunctionGridBytes == NULL 初音之恋 发表于 2022-12-1 17:12
malloc失败也是0x00, 动态内存申请是在堆上的,临时变量是在栈上的
(引用自11楼)
变长数组并不等同于malloc,还是在栈上分配的,再说启动文件的Heap_Size也已经设置为0x200了
页:
[1]