您的位置:首页 > 其它

C Abstract——Struct 结构体

2015-07-08 18:48 323 查看
最近在研究Linux内核模块编程,遇到最多的就是结构,屡屡碰到一些生疏的用法如位域,成员初始化,于是便想着回顾一下。

结构体是什么?结构体是一系列变量的组合,就像C++中的类,结构体的在声明时不会分配内存空间,故而在使用时需要定义结构体变量。从本质上来说,结构体变量就是一片内存空间,但是我们对这篇内存中的存放内容进行了限定。

到这就会出现两个基本问题,一是结构体变量如何定义;一是结构体变量分配的空间是多大。基于这两个问题给出如下程序进行说明:

#include <stdio.h>

struct student{

    char name[15];

    int age;

};

struct student student_a;

typedef struct student stu;

stu student_b;

int main(int argc, char* argv[])

{

    printf("struct student size %d.\n", sizeof(struct student));

    printf("student_a size %d.\n", sizeof(student_a));

    printf("student_b size %d.\n", sizeof(student_b));

    return 0;      

}

由上述程序可以看出结构体定义与变量定义差别不大,需要注意的是变量的类型为 struct 类型名 ,struct不可忽略。然而为方便起见,可以使用typedef来重新定义一个结构体类型名。至于结构体所占的空间,存在一个内存对齐,即是与最长变量对齐,如果最长变量超过计算机的字长则已计算机字长为对齐单位,上述输出结果为20。

需要注意的是结构体中位域的概念,位域的实现是以bit为最小单位来存储变量,在定义时在变量名后加:num,num为变量需要的比特数,在分配时遵循一个变量不跨越多个不完整字节,且变量类型为无符号型或者整型,宽度为0的位域会强制讲下一个位域分配新的字节中,下例给出的结构体占两个字节:

struct test{

    unsigned char a:3;

    unsigned char b:4;

    unsigned char c:2;

};

接下来就是结构体的初始化,结构体的初始化方式有很多,常见的几种方式如下:

1.花括弧内用逗号隔开直接初始化;

2.花括号内成员名前加上成员运算符"."赋值;

3.对变量名.成员名逐个赋值;

注:凡是进行初始化而又未进行复制的成员默认会初始化为0(数值为0,字符串为'\0',指针为NULL)。

似乎也没什么可讲的,后面有相关疑问再补充!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: