美文网首页玩转树莓派程序员
闲聊c/c++: 内存基础操作

闲聊c/c++: 内存基础操作

作者: 随风而行之青衫磊落险峰行 | 来源:发表于2017-10-31 06:18 被阅读81次

我总结的三个内存相关结论:
结论1: int addr变量的值和地址是完全不同的两个东西!
结论2: 内存地址的获取必须使用取地址&操作符或malloc/new等方式
结论3: 请使用机器相关的size_t来表示内存取值范围
具体如下:
在windows中做测试,你会发现:


我们来分析一下 int addr=0x100000这句话的含义:
当我们声明了 int addr,编译器就知道要在栈内(不是堆哦)分配一个4 byte(在x86和x64中,sizeof(int) = 4byte)的变量addr。
当我们进行赋值时,addr = 0x100000,那么该变量对应的值为0x1000000.
实际上该变量还有地址,如何获取呢?
通过取地址操作符&来获取:

你会发现addr的值=0x100000,而addr的地址=0x00cff700
结论1: int addr变量的值和地址是完全不同的两个东西!
那么为什么0x100000和0x00cff700类型相同,看起来区别不大,但是(int)addr却报错呢?
这是因为windows中(其他操作系统也应该类似)是虚拟内存地址映射,而且内存地址的区间是有规定范围的,并不是你能直接声明获取的。

这个内存区间,并不是你能够直接赋值控制的。
在c/c++中,你只能通过两种方式来获取地址:
a. 如上所述,通过取地址操作符&来获取栈分配的变量的地址
b. 使用c语言中的malloc等内存分配函数或c++中new操作符后返回的指针(地址)
b中的malloc内部调用的是windows 系统api,而c++调用的是c语言的malloc函数。
由此可见,实际上,在操作系统层面,你根本无法直接操作硬件,而是必须要调用操作系统提供的api才能进行所有的系统操作。操作系统才是上帝!(这也是dos时代的程序员对windows最大的抱怨,无法直接控制硬件,必须通过间接方式。)
至于其他系统(除了嵌入式)都是无法直接控制硬件,必须要使用操作系统提供的api才可以!
int addr = 0x100000;

int* pAddr = &(addr);

//int ret = *(int *)addr;
int ret = pAddr; //通过方式,从地址获取对应的值

printf("%d\n", addr == ret); //返回1,true
结论2: 内存地址的获取必须使用取地址&操作符或malloc/new等方式
实际上用int来表示指针取值范围非常可怕,因为在32位和64位系统上,很多系统sizeof(int)都等于4byte,意味着在64位系统上,无法表示完全的指针取值范围。
请使用size_t来表示地址取值范围,保证无误.
结论3: 请使用机器相关的size_t来表示内存取值范围
附sizeof各个平台下基础数据类型的字节长度:(本人花了不少时间测试所得)


我曾经写过几篇相关的文章,提供一下url以供参考吧!
闲聊c/c++: 各平台下基本数据类型的字节长度
http://www.jianshu.com/p/1116616940bb
闲聊c/c++: size_t、ptrdiff_t、socklen_t数据类型
http://www.jianshu.com/p/51347fcf539c
闲聊c/c++: 谈内存(大/小端,高/低字节,高/低地址)
http://www.jianshu.com/p/c41741b5c19d
闲聊c/c++: 再谈内存(c/c++,java,c#,js,objc中的大小端以及装箱拆箱和统一类型系统)
http://www.jianshu.com/p/1367009a3fce

青衫磊落险峰行
2017-9-19 0:13

相关文章

  • 闲聊c/c++: 内存基础操作

    我总结的三个内存相关结论:结论1: int addr变量的值和地址是完全不同的两个东西!结论2: 内存地址的获取必...

  • Android中缓存理解(一)

    Java GarbageCollection(GC) Java不能像C/C++那样直接对内存进行操作(内存分配和垃...

  • 2018-11-11 #C++ 内存模型#

    C++ 原子操作内存模型 C++ 原子操作内存模型解决并发编程的什么问题? 相信在大多数应用程序员眼里,代码在编辑...

  • CUB:一个轻量的现代C++基础类库

    CUB(C++ Unified Base)是一个轻量的现代C++基础类库,遵循C++14基础语言版本。提供了内存、...

  • c++内存管理

    c++内存管理长文 c++内存管理

  • Java基础

    Java和C++的区别?a. Java没有指针。c++可以通过指针直接操作内存,但这个动作是危险的,指针引起的操作...

  • C++学习笔记

    初识C++ C++标准格式 变量 作用:给一段指定的内存空间起名,方便操作这段内存。语法:数据类型 变量名 = ...

  • 内存管理

    内容包括: C++内存管理 Java内存管理 C++内存管理 内存分配方式 在C++中,内存分成5个区,分别是栈、...

  • C/C++内存和crash分析

    C/C++内存和crash分析 标签(空格分隔): C/C++ native内存 段错误 native内存泄露 C...

  • 闲聊c/c++: 在ubuntu中使用vscode调试C++程序

    本篇视频基于: 闲聊c/c++: win10中u盘引导安装ubuntu(视频) 闲聊c/c++: 在ubuntu中...

网友评论

    本文标题:闲聊c/c++: 内存基础操作

    本文链接:https://www.haomeiwen.com/subject/xyvisxtx.html