完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
简化描述:
我在程序中定义了如下类型的一个结构体: typedef struct { uint8_t* Rxbuffer; uint8_t timer; }Hardle_typedef; 然后用Hardle_typedef去定义一个变量,结果芯片没现象,改成如下形式就没问题了: typedef struct { uint8_t Timer; uint8_t* Rxbuffer; }Hardle_typedef; 请问大神们这是踩了C语言指针的陷阱了吗?请帮忙解释一下。 |
|
相关推荐
10个回答
|
|
定义后,Rxbuffer是否进行了赋值?
|
|
|
|
结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。 所以我觉得你定义的没有问题 ,看看你的变量是怎么样的啊
|
|
|
|
跨界F16 发表于 2018-8-19 07:35 比如定义Hardle_typedef PE_Handle,然后程序中用了PE_Handle,经过编译发现上述两种结构体的情况占用的SRAM居然是不一样的 |
|
|
|
一般的内存分配都是连续性的分配块内存的,指针变量存的是将要跳转的空间地址,没有把开辟的地址赋给嵌套在内层的指针变量!这样跳转到的地址并不一定就在刚分配开辟的连续地址内,只有将开辟的内存地址写在指针变量里,才能让指针跳到指定的开辟的内存空间!
|
|
|
|
maqyun 发表于 2018-8-19 07:47 本帖最后由 XinLiYF 于 2018-3-30 12:39 编辑 默认情况下,都是四字节对齐的。指针是地址,占四个字节,uint8_t占一个字节。如果把uint8_t放到结构体的开头(第二个结构体)结构体占八个字节。如果放到结构体尾部(第一个结构体)结构体占五个字节。 可能你程序里面出现野指针了。 |
|
|
|
追踪一下代码吧,看看指针跑到哪里去了。估计是野指针,挂上调试器看一下堆栈应该能看得出。
|
|
|
|
很显然把问题最关键的东西没有写明白。。。。那就是“然后用Hardle_typedef去定义一个变量”,定义变量和使用部分怎么个使用法?要知道指针可是要初始化才能使用的。。。
|
|
|
|
|
|
|
|
同意楼上的看法,定义结构体中的指针,只要语法没有错误,编译通过,应该没有问题;问题在你怎么用的,也许变成了野指针,出问题了
|
|
|
|
你在别处使用了吗?正常定义是绝不会出问题的。指针变量也是个变量而已,没什么很特殊地方。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
75 浏览 0 评论
2436 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1260 浏览 0 评论
3306 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3078 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 22:49 , Processed in 0.556628 second(s), Total 56, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号