zoukankan      html  css  js  c++  java
  • 驱动中的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;

      

  • 相关阅读:
    GoldenGate Studio 12.2.1.1发布
    重构-改善既有代码的设计完整笔记系列之8
    重构-改善既有代码的设计完整笔记系列之6、7
    Java多线程开发系列-线程管理
    Java多线程开发系列-线程活性故障
    Java多线程开发系列-线程间协作
    Java多线程开发系列-基础
    了不起的Java-CompletableFuture组合异步编程
    了不起的Java-Optional替代null处理
    了不起的Java-Lambda替代设计模式
  • 原文地址:https://www.cnblogs.com/lucheng/p/2830296.html
Copyright © 2011-2022 走看看