知道c语言可以直接访问物理内存,但是如和来访问呢?给一个物理地址可以如0x0f3可以知道它的值吗?

如题所述

第1个回答  2013-01-28
只要是在windows的保护模式下运行,就根本不可能直接访问真实的物理地址。不管用什么语言。追问

那如果在DOS实模式下呢?

追答

可以的。

追问

怎么做呢

追答

DOS下就不可以用C语言了吧。在汇编中可以这样,ds里面存储段地址,mov [bx], ax, 就相当于把ax的值放入[ds]:[bx]的地址空间里了。

追问

插入汇编我可以写出来,我想试下用c语言的指针和地址符可不可以,但都不行!

追答

我不信你是在dos下写的C语言。windows下怎么可能直接访问,如果可以的话,那你在那些重要的地址乱写,那系统不立马崩溃。

追问

不好意思我没有说清楚,我的意思,假如你定义了一个结构体,你可以得出结构体的首地址,你可以也根据首地址,内部变量的类型和内存对齐推出每个内部变量的地址,假如你推出的一个变量的地址为0x0f30,那么你是否可以读出这个地址的值(仅根据这个地址,不考虑它的类型)!

追答

哦,明白了,但那其实不是真正的物理地址。你说的这个地址,应该只有在含有那个结构体的程序运行的时候才会存在吧,程序结束后变量不也就消失了。单就读取某个地址的值应该是可以的(注意这不是真正意义的物理地址。)我觉得应该将这个地址存储在一个指针变量里面,然后再访问,依我的浅见,在汇编中都不可以在代码中直接访问地址。可以继续推理,如果可以直接访问,那么你要访问多少个字节呢。。。

本回答被提问者采纳
第2个回答  2013-01-28
用指针或者取地址符。不可以,汇编可以。
第3个回答  2013-01-28
原来在DOS时代是可以的,windows时代好像比较麻烦,肯定能实现但是估计不是你想的难么简单!追问

我知道c语言中插入汇编可以做到。不插入汇编如何实现,你能讲下你想到了办法吗?

第4个回答  2013-01-28
char *p = NULL;
p = (char *)0x0f3;
printf("%d\n",*p);追问

这个好像不行!

追答

应该是windows系统保护的原因
如果你放在别的环境类似LINUX试试

0x***指令引用的 0x***内存,该内存不能为read
c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查这种错误,认为地址分配已经成功,于是就访问0X00000000的地址,于是就发生内存违规访问,同时该进程被终止。ASCII字符填充组成的pif文件时会出现以下情况:一个非法的pif文件(用ascii字符\\''x\\...

出现:"0x0f8d0068"指令引用的"0x0f8d0068"内存。该内存不能为"written...
你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。二、如果都没有,那就从软件方面排除故障了。先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过...

0x0f是什么意思?
0X为C语言中十六进制转化为二进制的前缀表示方法,看后面的两位对应的数字。0x0f(十六进制)表示00001111(二进制)或15(十进制)。C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支...

"指令引用的"0x00000000"的内存.该内存不能为"read"请问怎么办呀?_百 ...
程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当...

...0X00000000''内存.该内存不能为''read''是怎么回事啊?
一、应用程序没有检查内存分配失败 程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之...

抓取电脑内存文件怎么查看电脑内存
首先,右击IE点属性,点击删除文件,删除所有文件(要是你有一目十行的能力,跳过此条)再打开你要保存的网页打开C:\\Documents and Settings\\(你的用户名)\\Local Settings\\Temporary Internet Files里面就是你刚才的网页所有东西了四用c语言如何获取内存地址1、获得函数的地址...

电脑内存问题,如图
你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。 二、如果都没有,那就从软件方面排除故障了。 原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过...

51单片机访问特殊功能寄存器
1. 51单片机的特殊功能寄存器(SFR)只能通过直接访问的方式进行读写,而不支持间接访问。间接访问通常是指对80H~FFH范围内的RAM空间进行操作,这与SFR是两个不同的概念。2. 在C语言或汇编语言中,无法实现对特殊功能寄存器的间接访问。这两种语言都要求直接对SFR进行操作。3. 想要在代码中检查并设置...

C语言中0x0和0x1有什么区别?
C语言里的0x0和0x1分别表示十六进制的数的0和1。C语言、C++、Shell、Python、Java语言及其他相近的语言使用字首“0x”,例如“0x5A3”。开头的“0”令解析器更易辨认数,而“x”则代表十六进制(就如“O”代表八进制)。在“0x”中的“x”可以大写或小写。对于字符量C语言中则以x+两位十六进制...

c语言中的0xf代表什么?
在C\/C++中,0x开头的数字是十六进制数字,后面跟的数字都要按照十六进制理解,0xf就是十六进制数字f,转换为10进制数字就是15。例如十进制数57,在二进制写作111001,在16进制写作39。在历史上,中国曾经在重量单位上使用过16进制,比如,规定16两为一斤。如今的16进制则普遍应用在计算机领域,这是因为...

相似回答