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* 只是反面教材,一般不会那么搞。上面提供的方法,仅供观赏,实际生产当中,谁那么写,必然被批。

 

转载于:https://www.cnblogs.com/xuyuheng/p/3629711.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值