天天看點

不使用sizeof求一個變量的大小

版權聲明:您好,轉載請留下本人部落格的位址,謝謝 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;
}           

繼續閱讀