OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4454|回复: 9

keil编程遇到指针问题,用结构体指针编译正确但是不能在开发板运行

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-7
在线时间
2 小时
发表于 2020-8-7 10:43:40 | 显示全部楼层 |阅读模式
1金钱
#include "LED.h"
#include "stm32f10x.h"
void LED_init(void)
{
GPIO_InitTypeDef *GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);  //使能时钟 enable disable

GPIO_InitStructure->GPIO_Mode=  GPIO_Mode_Out_PP;
GPIO_InitStructure->GPIO_Pin= GPIO_Pin_5;
GPIO_InitStructure->GPIO_Speed=  GPIO_Speed_50MHz;//GPIOB_5定为50MHz推挽输出
GPIO_Init(GPIOB,GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB5输出高

GPIO_InitStructure->GPIO_Mode=  GPIO_Mode_Out_PP;
GPIO_InitStructure->GPIO_Pin= GPIO_Pin_5;
GPIO_InitStructure->GPIO_Speed=  GPIO_Speed_50MHz;//GPIOB_5定为50MHz推挽输出
GPIO_Init(GPIOE,GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE5输出高
}
请问 GPIO_InitTypeDef *GPIO_InitStructure(编译正确);结构体指针为什么不行,写成GPIO_InitTypeDef GPIO_InitStructure(后面相应都改了编译都对)反而可以运行




最佳答案

查看完整内容[请看2#楼]

这个问题我在野火那边也回答过,好多人都不清楚。。。 局部变量这是个重点,定义时不赋值直接用它很危险,指针就更危险了。 你定义一个指针但没有实际分配给他一个地址,所以人家是个野指针,可能指null,可能乱指,导致程序乱跑。 你应该在定义指针时malloc一个地址给他,或者之前就定义一个GPIO_InitTypeDef变量,把地址给这个指针(这样就没意义了).
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3833
金钱
3833
注册时间
2017-3-7
在线时间
1672 小时
发表于 2020-8-7 10:43:41 | 显示全部楼层
这个问题我在野火那边也回答过,好多人都不清楚。。。
局部变量这是个重点,定义时不赋值直接用它很危险,指针就更危险了。
你定义一个指针但没有实际分配给他一个地址,所以人家是个野指针,可能指null,可能乱指,导致程序乱跑。
你应该在定义指针时malloc一个地址给他,或者之前就定义一个GPIO_InitTypeDef变量,把地址给这个指针(这样就没意义了).
回复

使用道具 举报

9

主题

218

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1395
金钱
1395
注册时间
2020-5-12
在线时间
387 小时
发表于 2020-8-7 17:25:34 | 显示全部楼层
本帖最后由 叶子君 于 2020-8-7 17:30 编辑

个人愚见,第一点,局部变量没赋值,都是默认随机数赋值,所以第一点,你弄了个局部变量指针没赋值是不安全的,也就是野指针
第二点,指针是需要分配空间才能用的。所以加上一句 GPIO_InitStructure = malloc(sizeof(GPIO_InitTypeDef));
https://blog.csdn.net/ytuglt/article/details/46908583
如果用的局部变量的话,则空间会自动帮你申请好的了。
回复

使用道具 举报

2

主题

452

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4298
金钱
4298
注册时间
2018-5-14
在线时间
930 小时
发表于 2020-8-7 18:23:09 | 显示全部楼层
第一,你直接定义 *p p的值是不确定的,也是就野指针,对野指针进行赋值操作会导致内存异常。应该是GPIO_InitTypeDef *GPIO_InitStructure;GPIO_InitStructure=(GPIO_InitTypeDef )malloc(sizeof(GPIO_InitTypeDef ));然后这个变量才能正常使用,使用完必须使用free(GPIO_InitStructure);不然该变量占用的内存将一直被使用。
回复

使用道具 举报

0

主题

4

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2320
金钱
2320
注册时间
2020-4-23
在线时间
196 小时
发表于 2020-8-7 18:40:38 | 显示全部楼层
只有门牌号码,却没有与门牌号码对应的房间。家具放哪里啊?!
道法自然
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-7
在线时间
2 小时
 楼主| 发表于 2020-8-12 17:56:43 | 显示全部楼层
叶子君 发表于 2020-8-7 17:25
个人愚见,第一点,局部变量没赋值,都是默认随机数赋值,所以第一点,你弄了个局部变量指针没赋值是不安全 ...

懂了懂了谢谢谢谢
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-8-7
在线时间
2 小时
 楼主| 发表于 2020-8-12 17:57:24 | 显示全部楼层
a5820736 发表于 2020-8-7 16:00
这个问题我在野火那边也回答过,好多人都不清楚。。。
局部变量这是个重点,定义时不赋值直接用它很危险, ...

请问malloc和C语言一样要头文件吗
回复

使用道具 举报

3

主题

805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3833
金钱
3833
注册时间
2017-3-7
在线时间
1672 小时
发表于 2020-8-12 19:11:46 | 显示全部楼层
一般不建议使用动态内存,你又不是使用链表啥的,没必要,乖乖用局部变量就好了
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-8-13 09:53:31 | 显示全部楼层
这种情况 是不是会有警告出来?如没有,,C语言这一点有点偏弱了.
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2021-6-7
在线时间
1 小时
发表于 2022-3-11 13:38:17 | 显示全部楼层
叶子君 发表于 2020-8-7 17:25
个人愚见,第一点,局部变量没赋值,都是默认随机数赋值,所以第一点,你弄了个局部变量指针没赋值是不安全 ...

已解决
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 23:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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