不使用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