C Abstract——Struct 结构体

原创 2015年07月08日 18:48:47

最近在研究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)。


似乎也没什么可讲的,后面有相关疑问再补充!

版权声明:本文为博主原创文章,未经博主允许不得转载。

C 结构体 struct 详解

数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为...
  • zhanghow
  • zhanghow
  • 2016年12月05日 11:47
  • 3276

C语言结构体(struct)常见使用方法

结构体与函数: 关于传参,首先: void func(int); func(a.b.c); 把结构体中的int成员变量当做和普通int变量一样的东西来使用,是不用脑子就想到的一种方法。 另外两...
  • huqinweI987
  • huqinweI987
  • 2014年04月14日 01:51
  • 420551

定义结构体时的初始化默认值

定义结构体或者链表时的初始化的默认值
  • xueruifan
  • xueruifan
  • 2015年06月10日 16:36
  • 11095

C语言结构体struct的语法解析

本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如下:struct tag { int x; long y; ...
  • tyler_download
  • tyler_download
  • 2016年10月06日 17:05
  • 1406

C语言学习笔记(十二) -结构体 Struct

定义结构体变量/* 结构体 自定义的一种类型称为构造类型,在C语言中称为结构体 定义结构体: struct [结构体名] { [成员列表;] }; 定义...
  • wangzi11322
  • wangzi11322
  • 2015年03月17日 10:18
  • 1526

struct和typedef struct彻底明白了 && C语言结构体

转自:struct和typedef struct 分三块来讲述:   1 首先://注意在C和C++里不同     在C中定义一个结构体类型要用typedef:     typedef struct ...
  • zyh821351004
  • zyh821351004
  • 2015年08月24日 23:46
  • 11494

linux C 结构体struct的定义和初始化

linux C 结构体struct的定义和初始化
  • renlonggg
  • renlonggg
  • 2017年02月04日 17:00
  • 2206

CC++结构体初始化与赋值

1.CC++结构体的初始化今天看到项目中对自定义结构体初始化方式有点陌生,特在此罗列一下可用的结构体初始化的方式。对结构体struct A { int b; int c; }有几种初始...
  • K346K346
  • K346K346
  • 2016年05月30日 13:28
  • 20333

c++ 中 extern 对struct 结构体的使用

类型的定义和类型变量的定义不同, 类型定义只是描述一个类型, 是给编译器看的, 不会产生可执行代码。 变量定义是指在执行文件中真实得存在这么一块内容。    因为每个.c里都要写清楚类型定...
  • likewenkaixin
  • likewenkaixin
  • 2012年06月08日 22:26
  • 5968

结构体中的占位符用法

typedef union { struct x{ char a1 : 2; char b1 : 3; char c1 : 3; }x1; ...
  • ameyume
  • ameyume
  • 2011年03月21日 20:07
  • 4446
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C Abstract——Struct 结构体
举报原因:
原因补充:

(最多只允许输入30个字)