gnail092 发表于 2022-12-1 14:41:30

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

本帖最后由 gnail092 于 2022-12-1 15:41 编辑

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

leafstamen 发表于 2022-12-1 15:28:59

编译不报错吗,编译器不应该知道长度啊。
应该用malloc()

yunqing_abc 发表于 2022-12-1 15:36:11

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

C99支持变长数组

gnail092 发表于 2022-12-1 15:36:21

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

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

初音之恋 发表于 2022-12-1 16:19:35

单片机里一般不要在函数里面定义大数组,容易堆栈溢出各种异常,单片机还是适合一个萝卜一个坑的做法

redroof 发表于 2022-12-1 16:22:06

yunqing_abc 发表于 2022-12-1 15:36
C99支持变长数组
(引用自3楼)

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

1a2b3c 发表于 2022-12-1 16:23:33

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

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

lb0857 发表于 2022-12-1 16:29:56


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

gnail092 发表于 2022-12-1 16:32:44

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

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

gnail092 发表于 2022-12-1 16:34:55

lb0857 发表于 2022-12-1 16:29
估计是栈这里出问题   
会出现奇奇怪怪现象
(引用自8楼)

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

初音之恋 发表于 2022-12-1 17:12:41

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

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

2nd 发表于 2022-12-1 20:11:49

蹭前面的分析:isFunctionGridBytes == NULL

gnail092 发表于 2022-12-1 20:16:35

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

变长数组并不等同于malloc,还是在栈上分配的,再说启动文件的Heap_Size也已经设置为0x200了
页: [1]
查看完整版本: 请教数组局部变量非固定长度定义导致的奇怪现象