驱动中的C语言----指针与指针初使化

  在运用指针时,最多的错误就是指针的初始化。在程序中,一个未初始化的指针将会引起意想不到的问题。所以将指针初始化为NULL是个好习惯;在运用指针时,首先判断指针是否初始化,以防止指针指向一个未定义的地址。今天在写2.6内核的驱动时,就犯了这个问题。

 1 #include <linux/module.h>
 2 #include <linux/kernel.h>
 3 #include <linux/fs.h>
 4 #include <linux/cdev.h>
 5 
 6 static struct cdev *my_dev;
 7 static dev_t *ndev;
 8 
 9 static int my_open(struct inode *inode, struct file *file)
10 {
11     return 0;
12 }
13 
14 static struct file_operations my_fops = {
15     .owner = THIS_MODULE,    
16     .open  = my_open,
17 };
18 
19 static int my_init(void)
20 {
21     int ret;
22     my_dev = cdev_alloc();
23     cdev_init(my_dev, &my_fops);
24     ret = alloc_chrdev_region(ndev, 0, 1, "mydev");
25     if (ret < 0){
26         printk("alloc_chrdev_region err!\n");
27         return ret;
28     }
29     ret = cdev_add(my_dev, ndev, 1);
30     if (ret < 0){
31         printk("cdev_add err!\n");
32         return ret;
33     }
34     printk("my_init success!\n");
35     return 0;
36 }
37 
38 static void my_exit(void)
39 {
40     cdev_del(my_dev);
41     unregister_chrdev_region(ndev, 1);
42 }
43 
44 module_init(my_init);
45 module_exit(my_exit);
46 
47 MODULE_LICENSE("Dual BSD/GPL");

static struct cdev *my_dev;
static dev_t *ndev;

在程序中用指针的地方就可以直接写变量名,如:

void cdev_init(struct cdev *dev, struct file_operations *fops);

my_dev = cdev_alloc();

cdev_init(my_dev, &my_fops);   //这样用的前提是my_dev已被初始化,即上一条my_dev = cdev_alloc();对其进行了初始化

若定义如:static struct cdev my_dev;
     static dev_t ndev;    则应如下:

cdev_init(&my_dev, &my_fops);

所以当指针在运用前不能被初始经时,就不应将其定义为指针,比如在这个程序中:

static struct file_operations my_fops = {
 .owner = THIS_MODULE, 
 .open  = my_open,
};

就不能定义为:static struct file_operations *my_fops,因为当定义为指针时,程序中没有语句能对其进行初始化,使用这个未初始化指针是危险的。

若要用指针指向这个结构则应再定义一个指针变量,指向这个结构,再运用这个指针,如下:

struct file_operations *fops;

fops = &my_fops;

  

posted @ 2012-12-23 21:21  永不指步  阅读(219)  评论(0编辑  收藏  举报