最近比较关注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的指针当中,这样就可以还原数组(或者指针)寻址的操作。
原文:http://www.cnblogs.com/xuyuheng/p/3629711.html