不使用sizeof求一个变量的大小
来源:互联网 发布:自动记录运动轨迹软件 编辑:程序博客网 时间:2024/05/17 21:06
之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
问题是:
使用C实现求一个变量的大小,不使用sizeof。
首先我先把我的代码贴上:
#define size(x) ((char*)(&x+1)-(char*)(&x))
该宏定义就实现了刚刚的需求。
首先,我们知道,char是占用一个字节的大小,我们得到一个变量之后,先取其引用,即&x,则该引用指向变量x的首地址。
而&x+1,是跨越该x之后的第一个地址。
我们举个例子:
我们有一个数组:
int a[] = {10,20,30,40,50};
我们先看a的内存分布:
a也是指向数组第一个元素首地址的,也就是指向元素10所在的位置,则(*a)代表着就是值10,那么(*a+1)就相当于10+1=11;(a+1)指向的是下一个元素的位置,则(*(a+1))代表着就是20。
而&a指向的整个数组的首地址,虽然说整个数组的首地址就是第一个元素的首地址,但是整体感觉来说还是不一样的,这样来看,(*a+1)是数组中的第一个元素值加一,而(&a+1)是整个数组加一,下面这个图很好的诠释了这个问题。
所以说,我们想要求得一个变量的大小的话,只要使(&a+1)减去(&a),然后再转化成字节的形式就可以了。
而char类型正好占用一个字节的形式,所以将其强制转化为char*类型就可以求出其大小了。
2:在上面指针的分析当中,(a+1)是指向下一个元素的首地址,那么我们还有一种思路就是这样的,将变量放入到一个数组当中,将(a+1)减去a就得到了变量的大小,再强制转化为字节形式就可以了。
下面是我的实现:
#include <stdio.h>struct hello{ char c1; int m; char c2;};int main(void){ //我们需要求结构a的大小 struct hello a; //则将三个结构a放到数组中 struct hello b[] = {a,a,a}; //按照上面的思想进行求取 int s = (char*)(b+1) - (char*)b; //输出结果没有问题 printf("%d\n",s); return 0;}
1 0
- 不使用sizeof求一个变量的大小
- sizeof()来求一个类的大小
- 不使用sizeof计算int的大小
- sizeof求类的大小
- sizeof 求类的大小
- sizeof求类的大小
- sizeof一个类的大小
- 不使用sizeof,获取变量所占用的字节数
- 不使用sizeof,确定机器int大小
- sizeof求struct、指针、数组的大小
- sizeof求结构体的大小
- sizeof求结构体大小的问题
- sizeof求结构体的大小
- sizeof求结构体大小的问题
- 不使用sizeof求类型长度
- sizeof求类大小
- c中数组大小不能用变量的一个解决办法
- 不使用sizeof 判断一个数据所占的内存大小
- B+树,聚集索引,非聚集索引(辅助索引) 之一
- 科大讯飞 无录音权限
- 亲和数
- 前k小的数求法
- android 定时器
- 不使用sizeof求一个变量的大小
- IF-ERRORLEVEL使用方法
- Zend Framework2 - Layout配置,不同模块Module设置不同的layout
- Latex论文编写教程 计算机相关专业论文编写指南
- 默认EditTextView不自动获取焦点的方法
- 先学习搭建个架子:Eclipse java EE版 + S2SH + Oracle11g + Plsql.(3)
- 排序算法--希尔排序(JAVA)
- 深入理解DB2索引(Index)
- Android学习笔记(基础)之数据存储(一)