extern 数组
最近比较关注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 数组的更多相关文章
- sizeof(extern类型数组)
error: #70: incomplete type is not allowed 用sizeof计算数组大小,编译器提示不允许使用不完整的类型.在keil上编译直接报错,拿到vs2010上编译可 ...
- extern C小结
名词解释 1.extern extern翻译为外部的,用在变量或函数之前,使其可见范围拓宽,这就是为啥叫extern吧.那它是用来干嘛的呢?当用在变量或函数之前,提示编译器到其他模块寻找其定义. 举个 ...
- extern关键字详解
基本理解 extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. extern有两个作用 1.当它与"C"一起连 ...
- C语言基础学习
汇编语言又叫符号语言 出来机器语言和汇编语言外其他语言必须经过翻译(编译,和解释行)才可以执行 .c --> 编译(翻译成二进制代码 .obj) 链接 把目标程序和库函数以及其他目标程序链接起来 ...
- C语言细节笔记2
C语言常见问题笔记: 1. 指针的声明 char * p1, p2; p1 是一个指向char类型的指针,而p2是一个char类型变量 这是由于 * 并不是基本类型的一部分,而是包含 ...
- C语言学习书籍推荐《你必须知道的495个C语言问题》
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...
- 你必须知道的495个c语言问题(笔记)
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit 4byte char 8b ...
- 《你必须知道的495个C语言问题》读书笔记之第1-2章:声明和初始化
1. C标准中并没有精确定义数值类型的大小,但作了以下约束: (1) char类型可以存放小于等于127的值: (2) short int和int可以存放小于等于32767的值: (3) long i ...
- 浅谈C语言 extern 指针与数组
/* * d.c * * Created on: Nov 15, 2011 * Author: root */ #include "apue.h" int a[] = {3,2}; ...
随机推荐
- C++编程练习(14)-------“单例模式”的实现
原文:http://blog.csdn.net/oohaha_123/article/details/25190833 单例模式 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例 ...
- DOS攻击之详解--转载
源地址没有找到,间接引用地址:http://wushank.blog.51cto.com/3489095/1156004 DoS到底是什么?接触PC机较早的同志会直接想到微软磁盘操作系统的DOS--D ...
- LeetCode24 Swap Nodes in Pairs
题意: Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1-> ...
- LeetCode3 Longest Substring Without Repeating Characters
题意: Given a string, find the length of the longest substring without repeating characters. Examples: ...
- 基于C#实现的HOOK键盘钩子实例代码
本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键.程序主要实现了安装钩子.传递钩子.卸载钩子等功能.在传递钩子中:<param name="pHookHandle&quo ...
- WinForm实现跨进程通信的方法
public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...
- WPF 之 布局(二)
一.Canvas Canvas是最基本的面板,只是一个存储控件的容器,它不会自动调整内部元素的排列及大小,它仅支持用显式坐标定位控件,它也允许指定相对任何角的坐标,而不仅仅是左上角.可以使用Left ...
- IOS 视图切换动画
我在网上找到的这个小方法,被我举一反三使用的屡试不爽.比如用在,当视图需要执行某一方法跳转到新的一个UIView上,从底层渐变浮到最上层.就是一个不错的视觉效果或者当需要类似keyboard的效果从底 ...
- hadoop中hbase出现的问题
在安装hbase中出现问题如下: ERROR: Can't get master address from ZooKeeper; znode data == null 解决办法: 1.删除nameno ...
- 获取客户端的IP地址
/// <summary> /// 获取客户端的IP地址 /// </summary> /// <returns></returns> public s ...