C语言常用数据类型和自定义数据类型的存储空间

news/2025/1/12 16:13:01/文章来源:https://www.cnblogs.com/gwsong52/p/18667017

C语言常用数据类型和自定义数据类型的存储空间

想知道各种数据类型的存储空间长度,编码测试,代码如下:

  • 注意:用到offsetof宏,在stddef.h头文件中定义,一定要包含进去!!!
/* filename: sizeof.c */
#include <stdio.h>
#include <stddef.h> //for offsetof macro/* compile : gcc sizeof.c -o sizeofrun : ./sizeof                  *//* output sizeof common datatype and pointer */
void
out_sizeof (void)
{printf ("Sizeof CHAR : %lu\n", sizeof(char));printf ("Sizeof SHORT : %lu\n", sizeof(short));printf ("Sizeof INT : %lu\n", sizeof(int));printf ("Sizeof LONG : %lu\n", sizeof(long));printf ("Sizeof LONG LONG : %lu\n", sizeof(long long));printf ("Sizeof FLOAT : %lu\n", sizeof(float));printf ("Sizeof DOUBLE : %lu\n", sizeof(double));printf ("Sizeof LONG DOUBLE : %lu\n", sizeof(long double));printf ("Sizeof VOID : %lu\n", sizeof(void));printf ("---------------------------------------------\n");printf ("Sizeof CHAR pointer : %lu\n", sizeof(char*));printf ("Sizeof SHORT pointer : %lu\n", sizeof(short*));printf ("Sizeof INT pointer : %lu\n", sizeof(int*));printf ("Sizeof LONG pointer : %lu\n", sizeof(long*));printf ("Sizeof FLOAT pointer : %lu\n", sizeof(float*));printf ("Sizeof DOUBLE pointer : %lu\n", sizeof(double*));printf ("Sizeof VOID pointer : %lu\n", sizeof(void*));printf ("---------------------------------------------\n");
}/* define a function pointer */
typedef void (*MyFunctionPointer) (void);/* define a struct */
typedef struct _Obj Obj;
struct _Obj
{int id;char name[12];int *p;
};/* define a enum */
enum dtype {DT_INT, DT_FLOAT, DT_CHAR
};/* define a union */
typedef union _Uval Uval;
union _Uval
{double fval;long   lval;char  *sval;
};/* define a function */
void
out_info (void)
{printf ("Some information here!\n");
}/* output sizeof updefine datatype and other */
void
out_sizeof_other (void)
{char c[20];char buf[8][8];printf ("Sizeof struct _Obj is %lu\n", sizeof(struct _Obj));printf ("The name of struct _Obj offset is %lu\n",offsetof(Obj, name));printf ("The p of struct _Obj offset is %lu\n",offsetof(Obj, p));printf ("------------------------------------------------\n");printf ("Sizeof enum dtype is %lu\n", sizeof(enum dtype));printf ("Sizeof union Uval is %lu\n", sizeof(Uval));printf ("Sizeof function pointer is %lu\n", sizeof (MyFunctionPointer));printf ("Sizeof FUNCTION : %lu\n", sizeof(out_info));printf ("Sizeof char array c[20] is %lu\n", sizeof(c));printf ("Sizeof char array buf[8][8] is %lu\n", sizeof(buf));printf ("------------------------------------------------\n");
}/**/
int
main (int argc, char *argv[])
{out_sizeof ();out_sizeof_other ();return 0;
}
/* --(:-:)-- */

编译运行,结果如下:

songvm@ubuntu:~/works/xdn$ gcc sizeof.c -o sizeof
songvm@ubuntu:~/works/xdn$ ./sizeof 
Sizeof CHAR : 1
Sizeof SHORT : 2
Sizeof INT : 4
Sizeof LONG : 8
Sizeof LONG LONG : 8
Sizeof FLOAT : 4
Sizeof DOUBLE : 8
Sizeof LONG DOUBLE : 16
Sizeof VOID : 1
---------------------------------------------
Sizeof CHAR pointer : 8
Sizeof SHORT pointer : 8
Sizeof INT pointer : 8
Sizeof LONG pointer : 8
Sizeof FLOAT pointer : 8
Sizeof DOUBLE pointer : 8
Sizeof VOID pointer : 8
---------------------------------------------
Sizeof struct _Obj is 24
The name of struct _Obj offset is 4
The p of struct _Obj offset is 16
------------------------------------------------
Sizeof enum dtype is 4
Sizeof union Uval is 8
Sizeof function pointer is 8
Sizeof FUNCTION : 1
Sizeof char array c[20] is 20
Sizeof char array buf[8][8] is 64
------------------------------------------------

常用数据类型、指针、结构体、共用体、枚举

  1. long long 长度为8字节,与long长度相同,可见在LINUX平台用long long不是必要选项!!!
  2. 单精度(float)、双精度(double)、长双精度(long double0的长度分别为4、8、16字节,即32位、64位、128位,位数决定运算精度!!!
  3. 基本类型的指针类型长度都为8字节!!!
  4. 结构体的长度取决于用户的定义的成员的长度的和!!!
  5. 共用体的长度等于最长的成员长度!!!
  6. 枚举类型的存储长度与整型int相同!!!

定义了函数指针、结构体、枚举、共用体、一个简单的函数

  1. 函数指针定义:
    注意:按需求写出返回类型和参数,无类型用void,名字前加星号再用圆括号包上!!!
typedef void (*MyFunctionPointer) (void);
  1. 结构体定义:
    注意:offsetof宏做为一个值使用,指出结构成员在结构体中的偏移数值!!!
typedef struct _Obj Obj;
struct _Obj
{int id;        //  4 byteschar name[12]; // 12 bytesint *p;        //  8 bytes
};               //---------// 24 bytes
  1. 枚举类型定义:
    同样也可以用typedef来定义,可以直接引用DT_INT, DT_FLOAT, DT_CHAR这三个值,提高了代码的可读性!!!
enum dtype {DT_INT, DT_FLOAT, DT_CHAR
};
  1. 共用体定义:
    共用体的三个成员共用同一个存储空间,长度由占用空间最大的成员来决定!!!
    下面的定义加了一个整型的ival,长度是4bytes,其他成员长度是8bytes,所以最终长度还是8bytes。
typedef union _Uval Uval;
union _Uval
{int    ival;  //  4 bytesdouble fval;  //  8 byteslong   lval;  //  8 byteschar  *sval;  //  8 bytes
};              //-----------//  8 bytes
  1. 函数定义:
/* define a simple function */
void
out_info (void)
{printf ("Some information here!\n");
}
  • C语言中的函数是最好玩的,下一步就研究玩函数!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868223.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AT_abc388_f Dangerous Sugoroku 题解

太幽默了。 显然可以用矩阵快速幂解决,矩阵里维护距离当前点 \(B\) 以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度 \(O(B^3m\log n)\)。 然后你就 T 了。 此时你很急,你现在应该快点卡常来 AK 这场比赛而不是研究其他的做法,于是我…

多路复用与多路分解

主机维护一个Socket表,通过表中记录的ipport与socket对应关系进行封装报文,接受到报文时使用报文的ip和port查找对应socket的过程 称为多路复用与多路分解 TCP socket存有本机进程到对端进程的映射关系UDPudp是无连接的,本机ip port没有和对端ip port构成映射关系,udp的soc…

计算机网络-多路复用与多路分解

主机维护一个Socket表,通过表中记录的ipport与socket对应关系进行封装报文,接受到报文时使用报文的ip和port查找对应socket的过程 称为多路复用与多路分解 TCP socket存有本机进程到对端进程的映射关系UDPudp是无连接的,本机ip port没有和对端ip port构成映射关系,udp的soc…

.NET 中管理 Web API 文档的两种方式

前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式,希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库,它使得在 ASP.NET Core 项目中自动生…

idea设置快捷键

idea设置快捷键 下载安装idea 参考:pyhton、miniConda、pycharm下载安装配置中的pycharm下载安装配置即可,jetbrains系列软件都可如此操作。 查询快捷键 打开安装好的idea, ctrl+alt+s或手动打开Settings/设置, 点击左侧Keymap/按键映射页签, 点击右侧搜索框右侧的放大镜,…

抖音评论生成器在线工具,好评生成器软件,用js+html即可实现

开发技术HTML:用于搭建页面结构。 CSS:用于美化页面样式。 JavaScript:实现核心逻辑,包括文案生成、随机选择、复制功能等。 部分框架代码:<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name=…

Odoo18.0附件分享管理

需求背景 虽然odoo官方提供了文档的门户访问功能,外部用户可以在门户查看共享的文档和相关的附件。但是某些情况下,我们希望外部用户只能有限地能访问我们指定的附件,而不是能够访问整个文档和全部附件。 本文即是介绍为了解决此问题而开发的功能。 功能介绍 这里我们以销售…

git worktree同一个仓库多个分支并行开发和管理

Git Worktree 是 Git 提供的一个功能,允许你在同一个仓库中同时工作在多个工作目录中,每个目录都有自己的工作树和索引。这对于同时处理多个分支或版本非常有用。介绍 Git Worktree 是 Git 提供的一个功能,允许你在同一个仓库中同时工作在多个工作目录中,每个目录都有自己的…

idea汉化教程,jetbrains系列软件都适用

idea汉化教程,jetbrains系列软件都适用 下载安装idea 参考:pyhton、miniConda、pycharm下载安装配置中的pycharm下载安装配置即可,jetbrains系列软件都可如此操作。 汉化 打开安装好的idea, ctrl+alt+s或手动打开Settings/设置, 点击左侧Plugins/插件页签, 点击右侧Market…

搭建jumpserver堡垒机--基本使用(三)

一.给所有服务器设置只允许jumpserver机器登录(尽量不要操作)1.开放堡垒机ssh登录,xxx.xxx.xxx.xxx对应堡垒机ipiptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT2.拒绝所有机器ssh登录iptables -A INPUT -p tcp --dport 22 -j REJECT 二. 配置邮箱和创建用…

【学习笔记】斜率优化 dp

LearningForeword 斜率优化,顾名思义就是用一次函数的单调性来优化 dp,具体表现为利用单调性找到最优决策点从而优化掉需要枚举的决策点。 给斜率优化 dp 总结一个模板: \[dp_{i} = \min\{dp_{j} + calc (i,j)\} \]或者: \[dp_{i} = \max\{dp_{j} + calc (i,j)\} \]其中 \(…

安装MM系统(使用systemback封装Ubuntu系统iso镜像)

哈喽啊亲们!今天又是阳光明媚的一天,不知道亲们想me了没,今天小橘给大家分享一下MM系统镜像的封装流程,欢迎大家一起探讨。一、安装 MM 系统到其他机器的硬盘上 (一) BMC 挂载镜像 设置--一般--媒体重定向设置--一般设置--远程媒体支持--挂载 CD/DVD--填写信息--保存--选择…