这么写其实是没问题的。编译不会有问题。
一般直接写
int *addr=(int *)0x2000000;
*(addr++)=0x11;
....
但是以上都是理论,系统对一些地址比较敏感。
你要强制转换的地址是否存在?这个地址是不是已经被别的程序占用了?
你直接这样访问是很危险的,有些编译器会直接报错。
所以一般情况下,PC系统比较多的还是由系统分配地址。
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
你这个内存肯定是分到系统内存了 这样肯定出错
地址不能随便写成常量的
因为内存是系统统一分配的,地址也就是系统提供的
比如定义变量时,系统就给变量分配一块内存,地址是系统从没给用的内存中用一定的算法得到的。
你写的 0x20000000地址可能别的程序在使用着,或是系统的保护内存。不是你想用那个地址就用那个地址的
(int *)0x20000000
你怎么能这样写系统的内存呢
*addr=0x11; 你这样相当于在 0x20000000内存里面写值了
应该这样做
int *addr= new int();
*addr = 0x11;
30分钟彻底学会C语言指针