不使用sizeof求一个变量的大小

之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
问题是:
使用C实现求一个变量的大小,不使用sizeof。

首先我先把我的代码贴上:

#define size(x) ((char*)(&x+1)-(char*)(&x))

该宏定义就实现了刚刚的需求。
首先,我们知道,char是占用一个字节的大小,我们得到一个变量之后,先取其引用,即&x,则该引用指向变量x的首地址。

不使用sizeof求一个变量的大小_第1张图片

而&x+1,是跨越该x之后的第一个地址。

我们举个例子:
我们有一个数组:

int a[] = {10,20,30,40,50};

我们先看a的内存分布:

不使用sizeof求一个变量的大小_第2张图片

a也是指向数组第一个元素首地址的,也就是指向元素10所在的位置,则(*a)代表着就是值10,那么(*a+1)就相当于10+1=11;(a+1)指向的是下一个元素的位置,则(*(a+1))代表着就是20。

而&a指向的整个数组的首地址,虽然说整个数组的首地址就是第一个元素的首地址,但是整体感觉来说还是不一样的,这样来看,(*a+1)是数组中的第一个元素值加一,而(&a+1)是整个数组加一,下面这个图很好的诠释了这个问题。

不使用sizeof求一个变量的大小_第3张图片

所以说,我们想要求得一个变量的大小的话,只要使(&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;
}

你可能感兴趣的:(sizeof,指针,引用,变量大小)