最近比較關注C++對象的Linkage類型,然後今天突然想起extern數組這個奇葩的東西,稍微折騰了一下,順手寫個隨筆。
首先在cpp中定義幾個數組:
extern_array[] = {,,,, extern_array_normal[] = {,,,, extern_array_normal_const[] = {,,,,};
然後再另一個cpp中使用:
* extern_array_normal[ _tmain( argc, _TCHAR* address = reinterpret_cast<>(& first = *reinterpret_cast<*> second = *reinterpret_cast<*>(address + * ( third = *reinterpret_cast<*>(address + * (* address_ptr = reinterpret_cast<*>(&= address_ptr[= address_ptr[= address_ptr[ normal_first = extern_array_normal[ normal_second = extern_array_normal[ normal_third = extern_array_normal[ normal_first_const = extern_array_normal_const[ normal_second_const = extern_array_normal_const[ normal_third_const = extern_array_normal_const[=
上面的Demo簡單演示了extern數組各種使用的方法。
但是有種奇葩的情況是:
* 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的指針當中,這樣就可以還原數組(或者指針)尋址的操作。