在C语言中如果已经知道了一个数据的内存地址,怎样直接从内存中读取出该数据?

我刚学C语言,用的是DEV-C++软件。最近刚学到指针。我定义了一个指针变量,然后通过取地址符&取得了我已经定义的一个int数据的内存地址。但是我不想通过指针变量来直接输出该int数据的值,而是想直接读取内存的数据,看看和我定义的int数据值是否相同。
例程:
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int *m,*n;
m=&a;
n=&b;
//printf("*m=%d\t,*n=%d\n",*m,*n); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",m,n);
return 0;
}
通过这个程序,我知道了m , n的值。它们是int a,b的内存地址,但是不知道怎样直接读取这2个地址的内存数据,看看是否和我定义的值相同。

要读取内存数据的话,只能通过指针,你只能通过自己定义一个int的指针,让他指向一个内存地址,然后通过*指针的形式读出来。
你说的“我不想通过指针变量来直接输出该int数据的值,而是想直接读取内存的数据,看看和我定义的int数据值是否相同。”是没意义的,就好像你要确定我这个人是不是我这个人一样,如果你一定要写的话,可以写成这样。
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int adda=&a,addb=&b;
int *m,*n;
m=adda;
n=addb;
//printf("*m=%d\t,*n=%d\n",*m,*n); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",a,b);
return 0;
}
这里的m和n已经和a,b没有任何逻辑联系了,他们只是表示两个内存段的数据而已。
再明确点可以写成
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int adda=&a,addb=&b;//adda和addb仅仅表示两个内存地址
int contenta,contentb;
contenta=*adda;
contentb=*addb;//这两句的含义是两个内存地址里面的内容,他们和变量a,b没有逻辑关系
//printf("*m=%d\t,*n=%d\n",contenta,contentb); //这里不用指针变量直接输出int数据
printf("m=%d\t,n=%d\n",a,b);
return 0;
}
这里就是你说的比较a以及a所在的内存块(adda)里面内容是不是和a相等
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-26
#include <stdio.h>
#include <string.h>

void main()
{
int *p;
int i=10;

p=(int*)0x0012ff78;//i的地址
printf("%d\n",*p);

}
输出的结果为10,你先调试下,可以知道i的地址
*P等价于*(int*)0x0012ff78本回答被提问者采纳
第2个回答  2011-09-20
#include<stdio.h>
int main()
{
int a=123,b=1234567;
int *m,*n;
m=&a;
n=&b;
printf("*m=%d\t,*n=%d\n",*m,*n);//打印指针指向的值
printf("m=%d\t,n=%d\n",m,n);//打印指针内存地址对应的十进制数,因为过大,会显示为一个 负数
printf("m=%p\t,n=%p\n",m,n);//打印指针类型的数据,即指针本身的地址
getch();
return 0;
}

输出的结果是:

*m=123 ,*n=-10617
m=-54 ,n=-52
m=FFCA ,n=FFCC

可以看到,b的值已经不是1234567,因为定义的b是个2个字节的,最大是65536,再大的数就会溢出,然后显示为负数的,同理,FFCA,FFCC也是过大,所以,m,n对应的十进制也是负数。追问

我这里没有出错:
*m=123 , *n=1234567
m=2293620 ,n=2293616
int 好像占4个字节

追答

对了,不同的平台可能int的字节大小也不一定的,与平台有关,平时开发,用的是size_t类型的。

第3个回答  2011-09-21
调试,vc6 有调试功能,就是加一个断点,再点击调试图标,不是感叹号,调到你想看的那句后,工作空间下边有两个窗口,右边的那个有左右两排网格,在左边输入你的变量或地址,右边会自动显示对应的值,大致就是这样,如果有错的话,你自己试试
第4个回答  2011-09-20
*和&是一对相反意义的运算符,一个取值(仅连地址量),一个取地址(仅连变量)。

在C语言中如果已经知道了一个数据的内存地址,怎样直接从内存中读取出...
要读取内存数据的话,只能通过指针,你只能通过自己定义一个int的指针,让他指向一个内存地址,然后通过*指针的形式读出来。你说的“我不想通过指针变量来直接输出该int数据的值,而是想直接读取内存的数据,看看和我定义的int数据值是否相同。”是没意义的,就好像你要确定我这个人是不是我这个人一样...

C语言中,数据在内存中是如何存储的,有事如何读取的?
C语言中每个变量都对应一个地址,读取变量可以直接调用变量或者取地址。

c语言 怎么将字符串中的地址取出其内存输出
所以可以表示为str,或者&str[0]。如果说取其他元素的地址,&str[对应下标]就可以了。因为地址连续,定义指针接收,还可以通过指针加减获取对应元素地址。比如char *p=&str[2];(我们让指针指向第3个元素地址),那么p++;p就是指向了第4个元素地址。同理p--;就指向第2个元素地址。注意,数组名str...

c语言如何实现输出变量的内存地址
回答:对于变量可以直接利用取地址运算符&获取变量的地址,之后通过printf语句进行输出。 具体实现方法可以参考如下程序段: int a=3;printf("%x", &a); \/\/ 以16进制形式输出变量a的地址(不含0x前缀)

用C语言编写的程序,怎么从一个物理地址读数
win32下需要用驱动模式编程,dos下练着玩就无所谓了

如何打印出内存中某段地址的内容 用c语言
首先你要知道0~2g这个虚拟内存空间是不让打印的,因为是内核保护区域,这个区域的大小和位置与操作系统有关。所以并不是所有地址都可以随便让你打印的~~如果再允许的情况下:int i;for(i=0x1000;i<=0x2000;++i){ printf("%02x ",*(char *)i);} ...

C语言关于地址的读写问题
非要直接去往指定地址里写数据也不是不可以,只是崩溃的几会很大,如果在DOS环境中,用TC编译,则可以用两种方法,一

c语言如何读取内存
正常情况下,都是分配内存空间 然后读取 char *buf = malloc(123);再访问buf 在嵌入式或者单片机中,有时会访问绝对地址 unsigned char * p = (unsigned char *)0xB1234456;\/\/内存地址值 然后通过*p访问该地址。

请问如何读取系统内存中任意地址的数据,如0x100,用C语言实现。_百度知 ...
这个空间中会根据系统需要由系统分配一定的 region 或一系列的 regions。只有位于这些 regions 的地址是可以被ring3 进程读取的。所以比如任意地址 如 0x100 若这个地址不再任何一个 region 当中。就会出错(指定地址无内存)。实际上即是说,系统没有为 0x100 这个地址建立页表映射,也就不可读。

怎样利用C语言修改已知内存地址里的内容?
char *p;p = (char*)0x400000; \/\/你要用0x打头,而且指针必须有类型 scanf("%s", p);这个程序你在PC机上不要去试,基本上都失败的,这种直接指定地址的做法,一般都是在嵌入式开发中使用的。

相似回答