C语言进阶——struct和union分析10
struct的小秘密:
- C语言中的struct可以看作变量的集合
- struct的问题:空结构体占用多大内存呢?
程序实例1:
#include <stdio.h> struct TS
{ }; int main()
{
struct TS t1;
struct TS t2; printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2); return ;
}
对于空结构体这个概念不同的编译器可能做出的选择不一样:
- 像gcc,codeblocks,vs这种编译器可以接受空结构体,不会报错
- 像vc和bcc编译器就不能接受空结构体这种概念
- 对于空结构体这个概念,是一个灰色地带,不存在哪种编译器做出的选择更加正确
结构体与柔数组:
- 柔性数组即数组大小待定的数组
- C语言可以由结构体产生柔性数组
- C语言结构体中的最后一个元素可以是大小未知的数组
程序示例2:
struct SoftArray
{
int len;
int array[];
};
那么就有一个问题了,sizeof(struct SoftArray);的大小是多少呢?SoftArray 中的array仅是一个待定使用的标识符,不占用存贮空间
程序示例3:(柔性数组的用法)
struct SoftArray
{
int len;
int array[];
};
//......
struct SoftArray sa;
sa =(struct SoftArray *)malloc(sizeof(struct SoftArray)+sizeof(int)*); sa->len=;
这只是一个代码片段,定义了一个int类型的柔性数组,长度为5
程序示例4:
#include <stdio.h>
#include <malloc.h> struct SoftArray
{
int len;
int array[];
}; struct SoftArray* create_soft_array(int size)
{
struct SoftArray* ret = NULL; if( size > )
{
ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size); ret->len = size;
} return ret;
} void delete_soft_array(struct SoftArray* sa)
{
free(sa);
} void func(struct SoftArray* sa)
{
int i = ; if( NULL != sa )
{
for(i=; i<sa->len; i++)
{
sa->array[i] = i + ;
}
}
} int main()
{
int i = ;
struct SoftArray* sa = create_soft_array(); func(sa); for(i=; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
} delete_soft_array(sa); return ;
}
定义了一个柔性数组,并且给它赋值,然后将值打印出来,大佬们自己看一下,我相信你们用眼睛瞟一下就懂了,嘻嘻。
C语言中的union:
- C语言中的union在语法上和struct相似
- union只分配最大成员的空间,所有成员共享这个空间
union的注意事项:union的使用受系统大小端的影响,大小端是什么意思呢,我就用一段代码给大家介绍一下
程序示例5:
union C
{
int i;
char c;
}; union C c;
c.i=;
printf("%d\n",c.c); //?
这段代码片段会打印什么呢,需要和我们的系统来决定:
小端模式:会从低地址到高地址来存贮这个1,也就是我们平常习惯的方式,因为打印的时候就是从低地址读取到高地址,,所以会打印出来1
大端模式:会从高地址到低地址来存贮这个1,也就是说这个1存贮在高位,由于打印的时候是从低位读取打印,所以会打印0
注意:这段代码其实很巧妙,我们给c里面的i(int类型 四个字节),然后打印c里面的的c(char类型),大家自己好好体会一下
程序示例6:(判断自己的系统是哪种模式)
#include <stdio.h> int system_mode()
{
union SM
{
int i;
char c;
}; union SM sm; sm.i = ; return sm.c;
} int main()
{
printf("System Mode: %d\n", system_mode());
return ;
}
如果输出为1,那么就是小端模式,如果输出为0,那么就是大端模式
小结:
- struct中的每个数据成员具有独立的存贮空间
- struct可以通过最后的数组标识符产生柔性数组
- union中的所有数据成员共享一个存贮空间
- union的使用会受到系统大小端的影响
C语言进阶——struct和union分析10的更多相关文章
- 第10课 struct 和 union 分析
1. struct的小秘密 (1)C语言中的struct可以看作变量的集合 (2)struct的问题——空结构体占用多的内存? [实例分析]空结构体的大小 #include <stdio.h&g ...
- 第10课 struct和union分析
struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1.空结构体的大小为0 2.结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: #include ...
- C语言进阶——enum, sizeof, typedef 分析11
枚举类型的使用方法: enum是C语言的 一种自定义类型 enum值是可以根据需要自定义的整型值 第一个enum的值默认为0 默认情况下的enum值是在前一个定义值的基础上加 1 enum类型的变量只 ...
- struct和union分析实例
1.#include <stdio.h>#include <malloc.h>typedef struct _soft_array{ int len; int ar ...
- C语言进阶——const 和 volatile 分析09
const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 ...
- 《C语言进阶剖析》课程目录
<C语言进阶剖析>学习笔记 本文总结自狄泰软件学院唐佐林老师的<C语言 ...
- 关于C中struct和union长度的详解
这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今 ...
- struct和union
struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...
- (C语言)共用体union的使用方法举例
曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用 ...
随机推荐
- 动态计算UITableViewCell高度详解 (转)
感觉挺有用的一篇文章,分析了4种解决方案.回头测试之.如果有别的方案,我会在后面补上. 原文地址:http://www.ifun.cc/blog/2014/02/21/dong-tai-ji-suan ...
- 伪响应式开发(PC和Mobile分离)
screen.width 无论把浏览器缩小还是放大,screen.width的值都不会改变,但是IE9及以上浏览器才支持这个属性. @media screen 媒体查询的巨大缺陷:切换页面布局的时候J ...
- Javascript基础--运算符与表达式
一.运算符 1.运算符分类: 按功能:算术运算符:+.-.*./.%.++.-- 例:12+12-11+5*6+20/5+5%2+(5%-2)+(-5++2)+(a++)+(++a)+(--a)+(a ...
- 【QT】【OpenCv】初始配置以及测试功能
#include "mainwindow.h" #include "ui_mainwindow.h" #include<opencv2/core/core ...
- Linux文件种类与扩展名
一.文件种类 1)普通文件:ls -al第一个字符为[-]的 纯文本文件(ASCII) 二进制文件(binary):Linux中的可执行文件 数据格式文件(data):特定格式的文件,如:Linux登 ...
- Suggestion: use tools:overrideLibrary="android.support.v17.leanback" to force usage
Android Studio下修改方法: 在manifest中添加<uses-sdk tools:overrideLibrary="android.support.v17.leanba ...
- mysql数据库 thinkphp连贯操作where条件的判断不正确的问题
前两天一直写一个基于thinkphp的东西,遇到从mysql数据库里select数据,where条件一直出现问题的情况.直接上代码: $history = M('history'); $suerId ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) D】精简改良(状压DP)
点此看题面 大致题意: 给你一张图,定义\(dis(i,j)\)为\(i\)与\(j\)的最短距离,现要求删去若干条边,使得图仍然联通,且\(\sum_{i=1}^n\sum_{j=i+1}^ndis ...
- http协议,tcp协议,ip协议,dns服务之前的关系和区别
长期以来都有一个问题,大家都在说http协议,tcp协议,ip协议,他们之间到底什么区别,有什么用,没人告诉我,最近看了这本<图解http>明白了一些,以下图片摘自这本书 一.理解一个传输 ...
- Angular2入门--架构概览
Angular 介绍 Angular 是一款来自谷歌的开源的web前端框架,诞生于2009年,是一款优秀的前端JS框架,已经被用于谷歌的多款产品. Angular 基于Typescript开发 ,更适 ...