|
发表于 2016-11-11 15:44:21
9937 浏览 3 回复
结构体指针与数组应用
刚在查看一段源码时发现一个关于结构体指针与数组的问题,弄清楚了,想来分享一下
先看 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当作数组用了,实在不理解,你就记住这个结论!希望对你有所帮助!
|
|
|
|
|
|
|
|
本帖最后由 TOPEET_moon 于 2016-11-11 17:08 编辑
学习了,不错
提醒一下:
kmalloc给数组分配内存
memset初始化赋0
如果指针当做数组,必须要经过上面两个步骤,否则会出现莫名其妙的结果~
如果这个指针不用了,可以使用free释放。
数组是在定义的时候就分配了内存的,所以可以直接拿来使用。
指针要当做数组使用,则必须在使用前,必须先确定到底需要多长,然后动态分配内存,清零,最后不用的时候可以释放掉。
在驱动中经常会遇到这种使用方法
|
|
|
|
|
|
|
|
楼主|
发表于 2016-11-11 21:32:52
恩恩,是的,谢了 |
|
|
|
|
|
|
|
发表于 2018-10-10 12:14:09
|
|
|
|
|
|
登录或注册
扫一扫关注迅为公众号
|