extern 數組


最近比較關注C++對象的Linkage類型,然后今天突然想起extern數組這個奇葩的東西,稍微折騰了一下,順手寫個隨筆。

首先在cpp中定義幾個數組:

1 int extern_array[] = {10,20,30,40,50};
2 int extern_array_normal[] = {10,20,30,40,50};
3 extern const int extern_array_normal_const[] = {10,20,30,40,50};

 

然后再另一個cpp中使用:

extern int* extern_array;
extern int  extern_array_normal[5];
extern int const extern_array_normal_const[];

int _tmain(int argc, _TCHAR* argv[])
{
    int address = reinterpret_cast<int>(&extern_array);
    int first   = *reinterpret_cast<int*>(address);
    int second  = *reinterpret_cast<int*>(address + 1 * sizeof(int));
    int third   = *reinterpret_cast<int*>(address + 2 * sizeof(int));

    int* address_ptr = reinterpret_cast<int*>(&extern_array);
    first   = address_ptr[0];
    second  = address_ptr[1];
    third   = address_ptr[2];

    int normal_first    = extern_array_normal[0];
    int normal_second   = extern_array_normal[1];
    int normal_third    = extern_array_normal[2];

    int normal_first_const    = extern_array_normal_const[0];
    int normal_second_const   = extern_array_normal_const[1];
    int normal_third_const    = extern_array_normal_const[2];

    size_t size_of_array = sizeof(extern_array_normal);
    //size_t size_of_array_const = sizeof(extern_array_normal_const); //error C2070: 'const int []': illegal sizeof operand

    return 0;
}

上面的Demo簡單演示了extern數組各種使用的方法。

但是有種奇葩的情況是:

1 extern int* extern_array;

extern_array的內容實際上在Link處理完之后,竟然變成了extern_array[]首地址。也就是說在另一個文件中通過extern_array[index](也就是*(extern_array + 1)),

相當於    “extern_array的值 + index * sizeof(int)" 得到的value值,然后再解引用*value。假設index = 0,那么value的值為0x0000000A, 解引用。。。然后發生神馬事情,不用說都知道,那么低的地址(空指針賦值地址分區)。。。。。。。

那extern int extern_array*豈不是不可以用了,雖然以下做法並不推薦,但是如果你真想用這個方法的話,可以先取extern_array得地址,然后保存到一個指向int的指針當中,這樣就可以還原數組(或者指針)尋址的操作。

 

2014年3月28日補充:

extern int extern_array* 只是反面教材,一般不會那么搞。上面提供的方法,僅供觀賞,實際生產當中,誰那么寫,必然被批。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM