驱动中的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;