数码之家

 找回密码
 立即注册
搜索
查看: 3545|回复: 8

c51单片机编译遇到莫名其妙的错误,某个数组占用别的变量的地址

[复制链接]
发表于 2021-6-10 22:10:18 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
本帖最后由 广东梁百万 于 2021-6-10 22:25 编辑


先删除内容,我应该找到原因了
发表于 2021-6-11 00:42:52 | 显示全部楼层
这个不奇怪呀,比如你数组定义了10个空间,在程序中不小心用到了第11就会占用下面的变量空间。

打赏

参与人数 1家元 +8 收起 理由
广东梁百万 + 8 我很贊同

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-11 07:28:47 来自手机浏览器 | 显示全部楼层
huxiangming 发表于 2021-6-11 00:42
这个不奇怪呀,比如你数组定义了10个空间,在程序中不小心用到了第11就会占用下面的变量空间。 ...

正是这回事,没想到这么简单的问题让我查找了两晚,昨晚我发贴后继续找原因,终于找到了。
回复 支持 反对

使用道具 举报

发表于 2021-6-11 12:29:40 | 显示全部楼层
广东梁百万 发表于 2021-6-11 07:28
正是这回事,没想到这么简单的问题让我查找了两晚,昨晚我发贴后继续找原因,终于找到了。 ...

数组越界、野指针,这些坑还是辣么经典
回复 支持 反对

使用道具 举报

发表于 2021-6-11 21:32:13 | 显示全部楼层
用指针操作数组时,涉及数组元素个数的,最好用“sizeof(数组)/sizeof(数组元素0)”得到元素个数。
回复 支持 反对

使用道具 举报

发表于 2021-6-11 22:03:40 | 显示全部楼层
可以定义宏:用sziof()取数组长度,程序读写数组时判断,勿使变量(指针)超出该值即可~
回复 支持 反对

使用道具 举报

发表于 2021-6-11 22:10:49 | 显示全部楼层
sz1988 发表于 2021-6-11 22:03
可以定义宏:用sziof()取数组长度,程序读写数组时判断,勿使变量(指针)超出该值即可~ ...

一般越界是这么产生的:

uint16_t   Arr[N];
for(int x=0; x<sizeof(Arr); x++)
........
回复 支持 反对

使用道具 举报

发表于 2021-6-12 20:44:10 | 显示全部楼层
t3486784401 发表于 2021-6-11 22:10
一般越界是这么产生的:

uint16_t   Arr[N];

安全做法:
uint16_t   Arr[N];
for(int x=0; x<(sizeof(Arr)/sizeof(Arr[0])); x++)
........
回复 支持 反对

使用道具 举报

发表于 2021-6-12 22:39:51 | 显示全部楼层
mmxx2015 发表于 2021-6-12 20:44
安全做法:
uint16_t   Arr[N];
for(int x=0; x

以下代码摘自 VS2005 源码 stdlib.h:

  1. #if !defined(_countof)
  2.     #if !defined(__cplusplus)
  3.         #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
  4.     #else
  5.         extern "C++"
  6.         {
  7.             template <typename _CountofType, size_t _SizeOfArray>
  8.             char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
  9.             #define _countof(_Array) sizeof(*__countof_helper(_Array))
  10.         }
  11.     #endif
  12. #endif
复制代码


也是个比较好的习惯,即区分 sizeof 与 countof,同时还可以领略一下 C++ 的模板函数、定长数组引用
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-23 21:33 , Processed in 0.405601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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