免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gigabyte
打印 上一主题 下一主题

给内存地址"0x123456789"赋值为0,请写出代码 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2010-03-10 11:17 |只看该作者
C是做不到的, 对指针直接赋地址一般会引起段错误。汇编。。。

论坛徽章:
0
42 [报告]
发表于 2010-03-10 18:29 |只看该作者
本帖最后由 star1983653 于 2010-03-10 18:30 编辑

姑且认为是64位的地址机器。
这个题目有问题:往0x123456789里赋值为0,表述就不清。0是一个字节?半字?还是一个字?
一个字节(8位):
char *p;
p = (char *)0x123456789;
*p = 0;

如果是半字或者一个字,0x123456789不是2的倍数也不是4的倍数也不是8的倍数。CPU是不只能直接寻址操作的。
按16位的半字来操作的话:
char *p;
p=(char *)0x123456789;
*p=0;
p=(char *)(0x123456789+0x1);
*p=0;

论坛徽章:
0
43 [报告]
发表于 2010-03-10 19:58 |只看该作者
请教一下,在code中用绝对地址对一个指针赋值并随之访问这个地址,跟链接器有什么关系呢?
谢谢!
new_learner 发表于 2010-03-09 16:13


本来,地址都是链接器出的,现在你要加一点手工的。自动加手工,在许多场合都要出问题的。一台自动车床在自动运行,你硬要插一手,多半会切断你的手指。呵呵。

论坛徽章:
0
44 [报告]
发表于 2010-03-10 21:43 |只看该作者
学习的!

论坛徽章:
0
45 [报告]
发表于 2010-03-11 08:05 |只看该作者
关键看指针占多少个字节

论坛徽章:
0
46 [报告]
发表于 2010-03-11 09:04 |只看该作者
学习,有意思。。

论坛徽章:
0
47 [报告]
发表于 2010-03-11 10:02 |只看该作者
本来,地址都是链接器出的,现在你要加一点手工的。自动加手工,在许多场合都要出问题的。一台自动车床 ...
beepbug 发表于 2010-03-10 19:58


我的理解是:指针p本身的地址是由链接器给出,这没错。

但是p指向的地址为什么不能赋给一个固定值?(我们不管这个地址能否访问,因为那是另外一回事)。
为p指向的地址赋一个固定值,这件事情本身跟链接器没什么关系吧?

论坛徽章:
0
48 [报告]
发表于 2010-03-11 11:42 |只看该作者
本帖最后由 x2 于 2010-03-11 11:45 编辑
我的理解是:指针p本身的地址是由链接器给出,这没错。

但是p指向的地址为什么不能赋给一个固定值? ...
new_learner 发表于 2010-03-11 10:02



    "指针p本身的地址是由链接器给出"是什么意思?
下面的指针p的地址是链接器给出的吗?
  1. #include <stdio.h>

  2. struct MyStruct
  3. {
  4.         unsigned char a;
  5.         unsigned char b;
  6.         unsigned short c;
  7.         unsigned int d;
  8. };

  9. int main(int argc, const char *argv[])
  10. {
  11.         int array[] = {0x01020304, 0x05060708, 0x090a0b0c};
  12.         struct MyStruct* p = (struct MyStruct*)array;
  13.         printf("%x %x %x %x\n", p->a, p->b, p->c, p->d);

  14.         return 0;
  15. }
复制代码

论坛徽章:
0
49 [报告]
发表于 2010-03-11 11:54 |只看该作者
long可以便于移植,long 是标准定义了的,long等于机器字长。
而int标准只是说大于等于shot,跟平台和编译器 ...
独臂剑客 发表于 2010-03-07 22:09



    顶,原来是便于移植

论坛徽章:
0
50 [报告]
发表于 2010-03-11 12:03 |只看该作者
题目:给内存地址"0x123456789"赋值为0,请写出代码

我的做法是
int *p;
p = 0x123456789;
*p =  ...
gigabyte 发表于 2010-03-07 21:45



    再32位机上,指针都是32位的吧。

    你这个地址是36位的啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP