请选择 进入手机版 | 继续访问电脑版

Exynos4412/4418/6818/i.MX6开发板俱乐部

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 826|回复: 4

结构体指针与数组应用

[复制链接]

1

主题

2

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2016-11-11 15:44:21 | 显示全部楼层 |阅读模式
刚在查看一段源码时发现一个关于结构体指针与数组的问题,弄清楚了,想来分享一下
先看  struct reg_dev
{
        char *data;
        unsigned long size;
       
        struct cdev cdev;
};
struct reg_dev *my_devices;
这里my_devices是一个结构体指针,没错吧!再看
for(i=0;i<DEVICE_MINOR_NUM;i++){
                my_devices[i].data = kmalloc(REGDEV_SIZE,GFP_KERNEL);
                memset(my_devices[i].data,0,REGDEV_SIZE);
                reg_init_cdev(&my_devices[i],i);
                device_create(myclass,NULL,MKDEV(numdev_major,numdev_minor+i),NULL,DEVICE_NAME"%d",i);
        }

这里就有问题了,my_devices明明只是个指针,为什么能当数组用???原因在下面:
my_devices = kmalloc(DEVICE_MINOR_NUM * sizeof(struct reg_dev),GFP_KERNEL);
这就是为什么my_devices可以当作数组使用的原因了,就是因为我们为它分配了相应的内存!所以就能把my_devices当作数组用了,实在不理解,你就记住这个结论!希望对你有所帮助!


回复

使用道具 举报

48

主题

604

帖子

1923

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1923
发表于 2016-11-11 17:02:24 | 显示全部楼层
本帖最后由 TOPEET_moon 于 2016-11-11 17:08 编辑

学习了,不错
提醒一下:
kmalloc给数组分配内存
memset初始化赋0

如果指针当做数组,必须要经过上面两个步骤,否则会出现莫名其妙的结果~
如果这个指针不用了,可以使用free释放。


数组是在定义的时候就分配了内存的,所以可以直接拿来使用。
指针要当做数组使用,则必须在使用前,必须先确定到底需要多长,然后动态分配内存,清零,最后不用的时候可以释放掉。


在驱动中经常会遇到这种使用方法
回复 支持 反对

使用道具 举报

1

主题

2

帖子

32

积分

新手上路

Rank: 1

积分
32
 楼主| 发表于 2016-11-11 21:32:52 | 显示全部楼层
TOPEET_moon 发表于 2016-11-11 17:02
学习了,不错
提醒一下:
kmalloc给数组分配内存

恩恩,是的,谢了
回复 支持 反对

使用道具 举报

0

主题

22

帖子

131

积分

注册会员

Rank: 2

积分
131
发表于 2018-10-10 12:14:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

28

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 半小时前 | 显示全部楼层
非常酷哦,不顶对不起良心
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|迅为电子 ( 京ICP备12036083号-2

GMT+8, 2019-1-24 19:05 , Processed in 0.084583 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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