Chinaunix首页 | 论坛 | 博客

分类: LINUX

2012-03-05 09:57:23

在linux设备驱动程序里面的scull有这么一段程序。。。。
/*mem设备描述结构体*/ struct mem_dev { char *data; unsigned long size; }; struct mem_dev *mem_devp;

mem_devp = kmalloc(MEMDEV_NR_DEVS * sizeof(struct mem_dev), GFP_KERNEL);

/*为设备分配内存*/ for (i=0; i < 2; i++) { mem_devp[i].size = MEMDEV_SIZE; mem_devp[i].data = kmalloc(MEMDEV_SIZE, GFP_KERNEL); }
问题一:为什么在此处把指针变量mem_devp直接赋予数组形式mem_devp[i]?
答:定义一个指针变量mem_devp,它指向内存中的某个地址2000。假设结构体mem_dev占有8个字节,
那么mem_devp[0]指向2000,而mem_devp[1]指向的地址是2008!当然并不是说可以取到你所说的无限大,
第一:因为当我们第二次赋值的时候,就已经产生了越界,会重写内存中 a[0] 后面地址空间所存储的东西;
第二:内存空间毕竟是有限的,不会出现无限开辟内存的情况。
严格来说,系统只给我们开辟了一个整型空间,后面的操作 我们都是违规越界操作不属于我们的数据空间。
问题二:mem_devp是指针变量,但为什么这里是mem_devp[i].size而不是mem_devp[i]->size?
答: mem_devp[0]表示一个结构体变量,mem_devp才是指针, 比如mem_devp[100]=malloc(8)是错误的,malloc的返回值是void *
阅读(8439) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~