一道C笔试题,求助

Rexxxxxxxxxx 2011-06-26 09:09:54
Please make out a few lines of C codes for accessing a fixed memory location. Requirement is to write an int variable 0xaa55 into the fixed address 0x67a9.

answer:
int a = 0xaa55;

int *pa = 0x67a9;

*pa = 0xaa55;
这样写对吗?
...全文
477 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 tagmsg 的回复:]

赞同 *((int*)(0x67a9)) = 0xaa55;
[/Quote]

windows内存保护机制规定不是所有的内存都能访问和修改。。
jijiyuyisheng 2011-06-27
  • 打赏
  • 举报
回复
*((usigned int*)(0x67a9))=0xaa55;
dongspook 2011-06-27
  • 打赏
  • 举报
回复
学习了
wangyangkobe 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ganjianh8 的回复:]

*((int*)(0x67a9)) = 0xaa55;
printf("%x\n", *((int*)(0x67a9));
[/Quote]

正解啊,学习啊
zxfqingtian807 2011-06-27
  • 打赏
  • 举报
回复
学习了
赵4老师 2011-06-27
  • 打赏
  • 举报
回复
纯DOS下有可能没问题。
morebread 2011-06-27
  • 打赏
  • 举报
回复
学习了。
acdbxzyw 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zqh2007 的回复:]

为什么小于64KB就不行呢?
[/Quote]
进程地址空间中的0x00000000 -- 0x0000FFFF 共64KB属于“NULL指针分配的分区”。
进程地址空间的这个分区的设置是为了帮助程序员掌握N U L L指针的分配情况。如果你的进程中的线程试图读取该分区的地址空间的数据,或者将数据写入该分区的地址空间,那么C P U就会引发一个访问违规。保护这个分区是极其有用的,它可以帮助你发现N U L L指针的分配情况。

C/C + +程序中常常不进行严格的错误检查。例如,下面这个代码就没有进行任何错误检查:
int* pnSomeInteger = (int*) malloc(sizeof(int));
*pnSomeInteger = 5;

如果m a l l o c不能找到足够的内存来满足需要,它就返回N U L L。但是,该代码并不检查这种可能性,它认为地址的分配已经取得成功,并且开始访问0 x 0 0 0 0 0 0 0 0地址的内存。由于这个分区的地址空间是禁止进入的,因此就会发生内存访问违规现象,同时该进程将终止运行。这个特性有助于编程员发现应用程序中的错误。

请参阅《Windows核心编程》第13章。
slyname2008 2011-06-27
  • 打赏
  • 举报
回复

应该这样
(volatile) *((int*)(0x67a9)) = 0xaa55;
ace99999 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 zqh2007 的回复:]
Please make out a few lines of C codes for accessing a fixed memory location. Requirement is to write an int variable 0xaa55 into the fixed address 0x67a9.

answer:
int a = 0xaa55;

int *pa = 0x6……
[/Quote]

pa = &a; //就行了
screwzm 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zqh2007 的回复:]

*((int*)(0x67a9)) = 0xaa55; //正解!
[/Quote]
+
lin1281151487 2011-06-27
  • 打赏
  • 举报
回复
向高手学习一下
ganjianh8 2011-06-26
  • 打赏
  • 举报
回复
*((int*)(0x67a9)) = 0xaa55;
printf("%x\n", *((int*)(0x67a9));
bdmh 2011-06-26
  • 打赏
  • 举报
回复
int *pa = (int*)0x67a9
不过0x67a9地址,未必可以写入
AnYidan 2011-06-26
  • 打赏
  • 举报
回复
看不东的题目, 如果此内存被系统占用?
5t4rk 2011-06-26
  • 打赏
  • 举报
回复
int a = 0xaa55;//这样是正确的 默认类型转化

int *pa = 0x67a9;//注意出现问题。不能这样写的 (类型不匹配的)

*pa = 0xaa55;//注意(这样写可以的,但是你的pa的地址,如果小于64KB。会出现内存不可访问的)
就是这么回事
金刚葫芦娃 2011-06-26
  • 打赏
  • 举报
回复
int a;
&a = 0xaa55;
int *pa;
pa = 0x67a9;
hackbuteer1 2011-06-26
  • 打赏
  • 举报
回复
int *pa = 0x67a9; 这个错了,无法从“int”转换为“int *”
5t4rk 2011-06-26
  • 打赏
  • 举报
回复
很显然错了啊
楼主
WCyaoming 2011-06-26
  • 打赏
  • 举报
回复
注意不要错。。。
加载更多回复(12)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧