最近比较关注C++对象的Linkage类型,然后今天突然想起extern数组这个奇葩的东西,稍微折腾了一下,顺手写个随笔。

首先在cpp中定义几个数组:

 int extern_array[] = {,,,,};
int extern_array_normal[] = {,,,,};
extern const int extern_array_normal_const[] = {,,,,};

然后再另一个cpp中使用:

extern int* extern_array;
extern int extern_array_normal[];
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 + * sizeof(int));
int third = *reinterpret_cast<int*>(address + * sizeof(int)); int* address_ptr = reinterpret_cast<int*>(&extern_array);
first = address_ptr[];
second = address_ptr[];
third = address_ptr[]; int normal_first = extern_array_normal[];
int normal_second = extern_array_normal[];
int normal_third = extern_array_normal[]; int normal_first_const = extern_array_normal_const[];
int normal_second_const = extern_array_normal_const[];
int normal_third_const = extern_array_normal_const[]; 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 ;
}

上面的Demo简单演示了extern数组各种使用的方法。

但是有种奇葩的情况是:

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

extern 数组的更多相关文章

  1. sizeof(extern类型数组)

    error:  #70: incomplete type is not allowed 用sizeof计算数组大小,编译器提示不允许使用不完整的类型.在keil上编译直接报错,拿到vs2010上编译可 ...

  2. extern C小结

    名词解释 1.extern extern翻译为外部的,用在变量或函数之前,使其可见范围拓宽,这就是为啥叫extern吧.那它是用来干嘛的呢?当用在变量或函数之前,提示编译器到其他模块寻找其定义. 举个 ...

  3. extern关键字详解

    基本理解 extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. extern有两个作用 1.当它与"C"一起连 ...

  4. C语言基础学习

    汇编语言又叫符号语言 出来机器语言和汇编语言外其他语言必须经过翻译(编译,和解释行)才可以执行 .c --> 编译(翻译成二进制代码 .obj) 链接 把目标程序和库函数以及其他目标程序链接起来 ...

  5. C语言细节笔记2

    C语言常见问题笔记:    1. 指针的声明     char * p1, p2;  p1 是一个指向char类型的指针,而p2是一个char类型变量  这是由于 * 并不是基本类型的一部分,而是包含 ...

  6. C语言学习书籍推荐《你必须知道的495个C语言问题》

    萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...

  7. 你必须知道的495个c语言问题(笔记)

    1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit    4byte char 8b ...

  8. 《你必须知道的495个C语言问题》读书笔记之第1-2章:声明和初始化

    1. C标准中并没有精确定义数值类型的大小,但作了以下约束: (1) char类型可以存放小于等于127的值: (2) short int和int可以存放小于等于32767的值: (3) long i ...

  9. 浅谈C语言 extern 指针与数组

    /* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...

随机推荐

  1. google对js延迟加载方案的建议

    浏览器在执行JavaScript代码时会停止处理页面,当页面中有很多JavaScript文件或代码要加载时,将导致严重的延迟.尽管可以使用defer.异步或将JavaScript代码放到页面底部来延迟 ...

  2. cocos2d-html5 笔记3: Node

    Cocos2d采用类似于Dom tree的那种形式来各个部分组织起来.最基本的基类是Node吧, Node Node 作为基类,函数很多,我觉得可以分为如下几类,树相关的函数, 一些公共的比较实用的函 ...

  3. ClamAV

    ClamAV 简介以及适用范围 ClamAV是一个在命令行下查毒软件,因为它不将杀毒作为主要功能,默认只能查出您计算机内的病毒,但是无法清除,至多删除文件.ClamAV可以工作很多的平台上,但是有少数 ...

  4. Joy of Programming: Understanding Bit-fields in C

    转:http://www.linuxforu.com/2012/01/joy-of-programming-understanding-bit-fields-c/ By S.G. Ganesh on ...

  5. maven-使用assembly自定义打包

    用maven管理项目引用依赖很方便,但是打包的时候如果是web包还好,会直接把依赖的jar包打到lib目录中,如果是jar包的话,依赖默认是不打入进去的 这样如果运行环境中没有依赖的jar包,就麻烦了 ...

  6. 关于yarn的spark配置属性

    spark1.2.0 These are configs that are specific to Spark on YARN Property Name Default Meaning  spark ...

  7. Java基础知识强化之IO流笔记83:NIO与IO

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  8. 通用权限管理系统接口文档V4.2 版本之角色管理功能介绍

    角色功能维护界面:可实现添加.修改.删除角色,向角色添加或删除人员,角色具有哪些菜单的管理功能.

  9. 剑指Offer16 判断子树

    /************************************************************************* > File Name: 17_Mirror ...

  10. codeforces 680A A. Bear and Five Cards(水题)

    题目链接: A. Bear and Five Cards //#include <bits/stdc++.h> #include <vector> #include <i ...