版權聲明:您好,轉載請留下本人部落格的位址,謝謝 https://blog.csdn.net/hongbochen1223/article/details/45130167
之前在騰訊實習生筆試的時候,遇到一個問題,當時一點思路也沒有,現在想了想,找了一些資料,大體上明白了應該如何去做。
問題是:
使用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;
}