OpenEdv-开源电子网

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

一句代码没看懂。请教大家

[复制链接]

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 2022-12-4 14:14:33 | 显示全部楼层 |阅读模式
1金钱
mqttBuffArray = pvPortMalloc(total * sizeof(char *));  /* mqttBuffArray是二级指针  */
这里我不明白是的如果mqttBuffArray是一级指针也可以像上面这么写,但是在我的认知里面,一级指针指向普通变量的地址,二级指针指向一级指针的地址,pvPortMalloc申请一段空间并返回空间的首地址,这个首地址可以表示二级指针的地址,也可以表示一级指针的地址吗?  如果换个角度理解这个代码的话,pvPortMalloc是从freertos分配的一段空间里面申请出一段空间并返回首地址,不论是一级指针还是二级指针,都是变量,变量就是存储在sram里面,就都有一个地址,但是pvPortMalloc申请的空间是一段纯粹的空间(这里的存储是指没有类型,属于void),是bss属性,所以这个空间可以被视为一级指针的存储空间,也可以视为普通变量的存储空间,可以这么理解吗?

最佳答案

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

去年自己挖的坑,今年自己来填,回答不一定正确,但是有参考性,pvportmalloc返回内存空间首地址是个void *类型,这个就有讲究了,是一个指针类型,指针类型得大小都是固定的,32位占4字节,64位占8字节,但是有一点,我记得查阅的资料是,不确定数据类型才会用void,然后可以直接赋值给任意数据类型,任意数据类型也可以复制给void类型,这个当中,应该是做了隐式类型转换,前面具体的表述肯定有问题,但是这个问题的答案就是这个 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2022-12-4 14:14:34 | 显示全部楼层
去年自己挖的坑,今年自己来填,回答不一定正确,但是有参考性,pvportmalloc返回内存空间首地址是个void *类型,这个就有讲究了,是一个指针类型,指针类型得大小都是固定的,32位占4字节,64位占8字节,但是有一点,我记得查阅的资料是,不确定数据类型才会用void,然后可以直接赋值给任意数据类型,任意数据类型也可以复制给void类型,这个当中,应该是做了隐式类型转换,前面具体的表述肯定有问题,但是这个问题的答案就是这个方向
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2022-12-4 14:16:03 | 显示全部楼层
更正:这个首地址可以表示普通变量的地址,也可以表示一级指针的地址吗?
回复

使用道具 举报

15

主题

313

帖子

0

精华

高级会员

Rank: 4

积分
827
金钱
827
注册时间
2015-2-12
在线时间
346 小时
发表于 2022-12-5 15:27:45 | 显示全部楼层
看事物角度问题:1、申请的存储区存储的是char指针类型数据;2、该存储区的首址就是指向char指针的指针。3、所以称之为二级指针。
不知说的对否?
回复

使用道具 举报

28

主题

113

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2021-8-10
在线时间
271 小时
发表于 2023-7-7 20:52:46 | 显示全部楼层
我倒觉得原因在于sizeof(char *),这里开辟的空间都是char指针数据类型,所以要用一个二级指针来接收。就跟int *p = malloc(total * sizeof(int))类似
回复

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-7-13 09:55:35 | 显示全部楼层
橘子汁真好喝 发表于 2023-7-7 20:52
我倒觉得原因在于sizeof(char *),这里开辟的空间都是char指针数据类型,所以要用一个二级指针来接收。就跟 ...

呃,就事论事,sizeof只有一个作用就是计算变量或者数据类型占用内存空间的大小,所计算的数据类型和实际申请的数据类型没有关系,malloc实际上只是在内存中申请一块内存出来,而且这块内存还是void *类型的,所以C语言中我们会看到使用malloc的时候,需要强制类型转换,但是这里不用,应该是编译器的隐式类型转换或者处理了这种警告,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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