之前在腾讯实习生笔试的时候,遇到一个问题,当时一点思路也没有,现在想了想,找了一些资料,大体上明白了应该如何去做。
问题是:
使用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;
}
原文地址:http://blog.csdn.net/hongbochen1223/article/details/45130167