当前位置: 首页 > news >正文

【C】-数据类型及存储空间长度

1、C语言中数据类型有哪些

C语言中有以下四种数据类型。

类型具体数据类型
基本数据类型int,char,float,double
派生数据类型arry,pointer,structure,union
枚举数据类型enum
void数据类型void

void
void是空类型,一般用于函数的返回类型表示,表示函数啥都不返回。通常用于以下三种情况。

/* 1、返回函数为空 */
void exit(int status);
/* 2、函数参数为空 */
int fun(void);
/* 指针指向为空,返回值可以转换成任何数据类型 */
void* malloc(size_t size);

2、数据类型的存储空间长度

在这里插入图片描述

3、sizeof()计算存储空间长度

在 C 语言中,sizeof 是一个编译时运算符,用于计算数据类型或表达式所占用的内存字节数。合理使用 sizeof 可提高代码的可移植性和安全性,尤其在动态内存分配和数据结构操作中至关重要。

3.1、sizeof 的基本语法

sizeof(type)       // 计算类型的大小
sizeof expression  // 计算表达式的大小(括号可选)

3.2、常见的使用场景

/* (1)动态内存分配:在 malloc、calloc 中计算所需内存大小: */
int* arr = (int*)malloc(sizeof(int) * 10);  // 分配10个int的空间/* (2)数组长度计算:获取数组元素个数: */
int arr[] = {1, 2, 3, 4, 5};
size_t length = sizeof(arr) / sizeof(arr[0]);  // 计算数组长度/* (3)结构体 / 联合体大小:计算自定义类型的内存占用: */
struct Person {char name[20];int age;
};
printf("%zu\n", sizeof(struct Person));  // 输出结构体大小(可能>24字节,涉及对齐)/* (4)数据传输与协议:在网络或文件传输中确定数据块大小: */
fread(buffer, sizeof(int), 10, file);  // 读取10个int到buffer

3.3、使用注意事项

(1)sizeof 是编译时运算符:

  • 在编译阶段求值,不执行表达式。
int a = 10;
sizeof(a++);  // a的值不会增加,因为sizeof在编译时处理

(2)数组名与指针的区别

  • 数组名在 sizeof 中表示整个数组:
int arr[10];
printf("%zu\n", sizeof(arr));  // 输出40(假设int为4字节)
  • 但作为函数参数时,数组名退化为指针:
void func(int arr[]) {printf("%zu\n", sizeof(arr));  // 输出指针大小(4或8字节)
}

(3)结构体对齐

  • 结构体大小可能因字节对齐而大于成员大小之和:
struct Example {char c;    // 1字节int i;     // 4字节
};
printf("%zu\n", sizeof(struct Example));  // 通常8字节(因对齐)

(4)void* 与其他指针大小一致

  • 所有指针类型(包括 void*)在同一平台下大小相同:
printf("%zu\n", sizeof(void*));  // 输出4或8字节

(5)不支持函数类型和位域

  • sizeof 不能用于函数类型或位域成员:
int func();
// sizeof(func);  // 错误:不能对函数使用sizeofstruct {unsigned int flag : 1;  // 位域
} s;
// sizeof(s.flag);  // 错误:不能对位域使用sizeof

相关文章:

  • 使用python把json数据追加进文件,然后每次读取时,读取第一行并删除
  • 【时时三省】(C语言基础)局部变量和全局变量
  • 12.6Swing控件4 JSplitPane JTabbedPane
  • C++ if语句完全指南:从基础到工程实践
  • ​​TLV4062-Q1​​、TLV4082-Q1​​迟滞电压比较器应用笔记
  • 如何用 HTML 展示计算机代码
  • 11-Oracle 23ai Vector Embbeding和ONNX
  • 大模型编程助手-Cline
  • 深入Java8-日期时间API:TemporalAdjusters、TemporalAdjuster类
  • 第34次CCF-CSP认证真题解析(目标300分做法)
  • 数据结构与算法——并查集
  • Java并发编程实战 Day 11:并发设计模式
  • table表格合并,循环渲染样式
  • Web攻防-SQL注入二次攻击堆叠执行SQLMAPTamper编写指纹修改分析调试
  • NoSQL 之Redis哨兵
  • 【数据结构】图
  • C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
  • JUC并发—volatile和synchronized原理(二)
  • 麒麟v10系统的docker重大问题解决-不支持容器名称解析
  • 多种风格导航菜单 HTML 实现(附源码)
  • 吉林市网站建设公司哪家好/网站快速排名优化哪家好
  • 网站返利二维码怎么做/优化百度百科
  • 代做课程设计的网站/怎么样做推广
  • 失眠先生 wordpress/南宁百度seo排名价格
  • 2015百度推广网站遭到攻击/软文是指什么
  • 深圳做网站-信科网络/广告联盟app下载官网