最近比较关注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. Ajax缓存解决办法

    解决办法有如下几种:       1.在服务端加 header("Cache-Control: no-cache, must-revalidate");(如php中) 2.在aja ...

  2. SQL SERVER-Delete和Truncate的区别

    背景:       一般在删除表数据时候,通常会有执行两个SQL语句:delete和truncate,有条件的删除我们平时都会用delete,而如果全部删除,那我们通常都会选择truncate,因为这 ...

  3. 终端I/O之行控制函数

    下列4个函数提供了终端设备的行控制能力.其中,filedes引用一个终端设备,否则出错返回,errno设置为ENOTTY. #include <termios.h> int tcdrain ...

  4. 关于测试Windows电脑端口的命令 —— telnet用法

    telnet服务在win7默认是打开的,如果没有打开要在电脑中打开. 命令格式:telnet ip port 例如:telnet 127.0.0.1 80 或者 telnet www.XXX.com ...

  5. IIS 之 打开/关闭 Internet 信息服务

    由于建立测试网站测试代码,重装电脑后不知道IIS在哪打开.下面以windows7为例介绍,打开IIS管理器的简要步骤. 第一步.查找IIS 1.点击" 开始 "→" 控制 ...

  6. How to installation V145 Renault CAN Clip diagnostic software

    Eobd2.fr has launched the new 2015 V145 Renault CAN Clip diagnostic tool (SP19-A and SP19-B). Here i ...

  7. [SQLServer]学习总结笔记(基本涵盖Sql的所有操作)

    --################################################################################### /* 缩写: DDL(Dat ...

  8. Java学习笔记——显示当前日期的三种方式

    一.Date类:这是一种过时的表达方式 import java.util.Date; Date date = new Date(); System.out.println((1900+date.get ...

  9. mysql-完整性约束条件

    PRIMARY :   主键 AUTO_INCREMENT  : 自增长 FOREIGN KEY : 外键 NOT NULL : 非空 UNIQUE KEY : 唯一 DEFAULT :  默认值 主 ...

  10. JAVA中的deflate压缩实现

    在文件的传输过程中,为了使大文件能够更加方便快速的传输,一般采用压缩的办法来对文件压缩后再传输,JAVA中的java.util.zip包中的Deflater和Inflater类为使用者提供了DEFLA ...