OpenEdv-开源电子网

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

关于结构体和结构体指针的一点疑惑和思考

[复制链接]

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
发表于 2015-6-28 22:47:48 | 显示全部楼层 |阅读模式
将结构体写法写成结构体指针形式,编译可以通过,但是程序无法运行,不知道错误在哪里,难道是没有赋初值原因,造成野指针?
[mw_shl_code=c,true]GPIO_InitTypeDef* GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); // PB0 GPIO_InitStruct->GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct->GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, GPIO_InitStruct); // PC3和PC4 GPIO_InitStruct->GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct->GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, GPIO_InitStruct);[/mw_shl_code]


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2015-6-2
在线时间
4 小时
发表于 2015-6-28 22:52:40 | 显示全部楼层
GPIO_InitStruct并没有指向一个具体的结构体……也就是你说的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-28 23:03:36 | 显示全部楼层
不要定义成指针类型。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2015-6-28 23:37:31 | 显示全部楼层
回复【2楼】yangzhen86:
---------------------------------
谢谢解答
回复 支持 反对

使用道具 举报

15

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2015-5-2
在线时间
29 小时
 楼主| 发表于 2015-6-28 23:40:09 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子哥!对了  模拟I2C驱动OLED也调试出来了,看芯片手册知道了每次发送一次数据后要等待一次ACK到来,即把函数IIC_Send_Byte修改一下:
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
SDA_OUT();      
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;    
delay_us(2);   //对TEA5767这三个延时都是必须的
IIC_SCL=1;
delay_us(2); 
IIC_SCL=0;
delay_us(2);
    }
IIC_Wait_Ack();
}
这样就可以了
回复 支持 反对

使用道具 举报

6

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2014-11-15
在线时间
91 小时
发表于 2015-6-29 00:05:41 | 显示全部楼层
用 指针,至少也要分配空间才能用
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-6-29 08:46:30 | 显示全部楼层
[mw_shl_code=c,true] GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); // PB0 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, GPIO_InitStruct); // PC3和PC4 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOC, GPIO_InitStruct);[/mw_shl_code]
不是因为你的结构体没赋初值,而是你的“指向结构体的指针变量”没有赋值,应该赋上结构体实体的首地址;
这里可以不用指针,直接如上代码使用结构体
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 19:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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