歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中構造數據類型的初始化

1. 數組的靜態初始化

我們都知道,一維數組的靜態初始化可以寫成

int A[] = {1,2,3,4};

int a[] = {
    [0] = 1,
    [1] = 2,
    [2] = 3
};

這種技巧在某些情況下其實很有用:(1)只想初始化數組中一些非連續的元素,其它元素都為0;(2)需要根據一組#define作為數組下標來保持某種映射關系的時候,就此我們舉個例子。

比如要定義一組錯誤碼和錯誤碼提示的字符串,我們可以用#define來定義錯誤碼,將錯誤碼作為錯誤提示字符串數組的下標,

/* 錯誤碼定義 */
#define EINVAL  1
#define ENOMEM  2
#define EFAULT  3

/* 錯誤提示字符串 */
char *err_str[] = {
        [0] = "Success",
    [EINVAL] = "Invalid arguments",
    [ENOMEM] = "Not enough memory",
    [EFAULT] = "Bad address"
};

對於這種情況,我們改變#define的值,都可以對err_str可以方便地不用做任何修改地使用索引。

2. 結構體的靜態初始化

我們可以用字段名稱對結構體進行初始化,這種方法在Linux內核源代碼中使用非常普遍,比如

static const struct file_operations mycdev_fops = {
 .owner = THIS_MODULE,
 .read = mycdev_read,
 .write = mycdev_write,
 .open = mycdev_open,
 .release = mycdev_release,
 .llseek = mycdev_llseek,
 .unlocked_ioctl = mycdev_unlocked_ioctl,
 .mmap = mycdev_mmap,
};

這段代碼常用於字符設備驅動程序的設計中,owner、read等都是struct file_operations的成員變量(數據類型是函數指針),這裡直接使用字段名稱完成函數指針類型的結構體成員的初始化。

再給個簡單的例子,定義坐標,

struct point {
    int x;
    int y;
    int z;
}

我們可以這樣初始化struct point,
struct point p = {.x = 3, .y = 4, .z = 5};這種使用字段名進行初始化的方法同樣適用於union類型。

Copyright © Linux教程網 All Rights Reserved