sizeof函数实现

sizeof

C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。

# include <stdio.h>  
#define m_sizeof(Value) ((char *)(&Value + 1) - (char *)&Value)  
int main()  
{  
  
    int i;  
  int a[20];

    printf("the size of i is %d \n",m_sizeof(i));  
 printf("the size of a is %d \n", m_sizeof(a) );  
    return 0;  
}  

<think>我们正在讨论C语言中的sizeof运算符,而不是函数。需要解释其原理。 注意:用户问题中写的是“sizeof函数”,但sizeof实际上是运算符,需要澄清这一点。 回答结构: 1. 明确sizeof是运算符而非函数 2. 解释其工作原理(编译时和运行时的情况) 3. 举例说明 4. 注意事项 最后提出3-5个相关问题。</think>### `sizeof`运算符原理详解 `sizeof`是C/C++语言中的**编译时运算符**(非函数),用于计算对象或类型的内存占用大小。其核心原理如下: #### 1. **编译时求值机制** ```c int a = sizeof(int); // 编译器直接替换为:int a = 4; (32位系统) ``` - 在编译阶段确定结果 - 不生成任何运行时指令 - 结果类型为`size_t`(定义在`stddef.h`) #### 2. **两种使用形式** ```c // 类型作为操作数 size_t s1 = sizeof(int); // 表达式作为操作数(不执行表达式) int arr[5]; size_t s2 = sizeof(arr); // 等价于sizeof(int[5]) ``` #### 3. **关键计算规则 | 类型 | 计算方式 | 示例(32位系统) | |------|----------|------------------| | 基本类型 | 固定字节数 | `char`:1, `int`:4 | | 指针 | 固定地址宽度 | 所有指针:4字节 | | 数组 | `元素大小×元素数量` | `int[5]`: 20字节 | | 结构体 | 成员大小总和+对齐填充 | 见下方示例 | | 联合体 | 最大成员的大小 | - | | VLA(C99) | **运行时**计算 | 见特殊场景说明 | #### 4. **结构体对齐计算示例 ```c struct Data { char c; // 1字节 // 编译器插入3字节填充(对齐到4字节边界) int i; // 4字节 double d; // 8字节 }; // sizeof = 1 + 3(padding) + 4 + 8 = 16字节 ``` #### 5. **特殊场景处理 - **可变长数组(VLA)**: ```c void func(int n) { int arr[n]; size_t s = sizeof(arr); // 运行时计算:s = n * sizeof(int) } ``` - **函数指针**: ```c void (*func_ptr)(); size_t s = sizeof(func_ptr); // 返回指针大小(与普通指针相同) ``` - **字符串字面量**: ```c sizeof("Hello") // 返回6(包含'\0') ``` #### 6. **与相关函数的对比 | 特性 | `sizeof` | `strlen` | `malloc` | |------|----------|----------|----------| | 执行时机 | 编译时/运行时 | 运行时 | 运行时 | | 操作对象 | 类型/对象 | 字符串 | 内存块 | | 包含终止符 | 是 | 否 | N/A | | 结果类型 | `size_t` | `size_t` | `void*` | #### 7. **底层实现原理 编译器处理过程: 1. 解析操作数类型 2. 计算类型大小(根据ABI规范) 3. 处理对齐要求(根据`#pragma pack`等指令) 4. 替换为常量值(非VLA情况)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值