指针还是指针指向的对象???

chrislin3217 2011-06-02 10:17:44
看C语言深度解剖,自己验证的时候出现的问题,

#include "stdio.h"

void main(int argc,char** argv)
{

int *p = (int *)0x12ff7c; //这个地址经过验证,可以访问
*p = 0x1000;
printf("p is : %x\n",p);

}

输出的结果和我预想的不一样,想看看大家的方法
...全文
214 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 meteor_code 的回复:]
引用 6 楼 chrislin3217 的回复:
引用 1 楼 bdmh 的回复:
你想要什么结果

我想打印的p的地址,但是得到的却是p指向的值,而且printf("p is : %x\n",*p);编译通过,但执行会出现错误。
[/Quote]
你测试的那个地址应该是用下面的程序测试的吧
void main(int argc,char** argv)
{
int p; //这个地址经过验证,可以访问
printf("p is : %x\n", &p);
}
然后你用这样的程序使用这个地址
void main(int argc,char** argv)
{
int *p = (int*)0x0428e2f; //这个地址经过验证,可以访问
*p = 0x1000;
printf("p is : %x\n", p);
printf("*p is : %x\n", *p);
getchar();
}
我告诉你这个现象是为什么
注意看2个程序,虽然他们不一样,但2个程序中的p都是main函数的唯一一个局部变量
同样的vc编译的环境(debug版本),2个程序中p的地址会是一样的
这样的话*p = 0x12ff7c;
你这样就是p等于了&p;
你然后
*p=0x1000;
相当与修改p,所以你打出来的是1000
这不是vc6的bug,是你用法不合理
如此美丽的你 2011-06-02
  • 打赏
  • 举报
回复
#include "stdio.h"

void main(int argc,char** argv)
{

int *p = (int *)0x12ff7c; //这个地址经过验证,可以访问
*p = 0x1000;
printf("p的地址 is : %x\n",&p);//here

}
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
用debug版本,不要使用release
release会优化掉很多东西的
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
定义一个全局变量,看他的地址是多少,
这个全局变量在上面的程序里也不要去掉
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 meteor_code 的回复:]
void main(int argc,char** argv)
{
int *p = (int*)0x0428e2f; //这个地址经过验证,可以访问
*p = 0x1000;
printf("p is : %x\n", p);
printf("*p is : %x\n", *p);
getchar();
}
上面是我的代码
下面是输出
p is : 428……
[/Quote]

呵呵 我也编译了下,的确和你的结果一样,但是我换了我换了个地址,就会出现错误,不知道你的地址为什么取这个地址?
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chrislin3217 的回复:]
引用 1 楼 bdmh 的回复:
你想要什么结果

我想打印的p的地址,但是得到的却是p指向的值,而且printf("p is : %x\n",*p);编译通过,但执行会出现错误。
[/Quote]
把你的输出拿出来看看,我怎么从没遇到过这个情况
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
vc6编译
Meteor_Code 2011-06-02
  • 打赏
  • 举报
回复
void main(int argc,char** argv)
{
int *p = (int*)0x0428e2f; //这个地址经过验证,可以访问
*p = 0x1000;
printf("p is : %x\n", p);
printf("*p is : %x\n", *p);
getchar();
}
上面是我的代码
下面是输出
p is : 428e2f
*p is : 1000
看不出有什么不对和不可理解的
AnYidan 2011-06-02
  • 打赏
  • 举报
回复
概念不清,不能区分指针指向对象的值和指针值

直接对自己指定的地址空间进行写操作,何其危险
哥特式空灵 2011-06-02
  • 打赏
  • 举报
回复
printf("p is : %x\n",p);错误
是printf("p is : %x\n",*p);
p8x8x8 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chrislin3217 的回复:]
引用 12 楼 p8x8x8 的回复:
引用 10 楼 chrislin3217 的回复:
引用 5 楼 p8x8x8 的回复:
*p = *0x12ff7c //就是说p = 0x12ff7c
//*0x12ff7c应该就是 0x1000
是这个意思吗?


和正常的想法不一样哦,建议你编下就知道问题在哪里了

int * p;//的意思是定义一个名字为p的 int*类型变量……
[/Quote]
原来是高手
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
在这里我表示道歉,因为我书看到一半就跑上来发帖了,在c语言深度解剖这本书的下一节有讲到这个问题,在此做总结:
总的来说这是vc6编译器的bug ,我试了vs2008结果是正常的。
其原因是*p = 0x1000;编译器误把这个值赋给了p存取的地址,而不是地址所指向的空间值,这当然和正常理解相悖,这一点可以把int类型换成char类型做验证得到,换过后很明显的看到低地址值被改写! 但是在程序开始之前加上int i = 10;(i的地址就是0x12ff7c)就不会出现问题,这个估计得看看编译器方面的数据。如何避免呢?就是不要对明确的地址做写操作,就想上面大神说的一样,而是直接按照规范来使用。
如果没有看懂上面的话或者有理解错误的地方,本问题出处c语言深度解剖 4.1.4和4.1.5,大家都懂的,我不是在打广告^^,上面有完整解释
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 p8x8x8 的回复:]
引用 10 楼 chrislin3217 的回复:
引用 5 楼 p8x8x8 的回复:
*p = *0x12ff7c //就是说p = 0x12ff7c
//*0x12ff7c应该就是 0x1000
是这个意思吗?


和正常的想法不一样哦,建议你编下就知道问题在哪里了

int * p;//的意思是定义一个名字为p的 int*类型变量 对p赋值的是 int *类型的变量 其值……
[/Quote]
个人认为说引用或者别名有点混淆指针和引用的概念,建议多看看c和指针这本书
p8x8x8 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chrislin3217 的回复:]
引用 5 楼 p8x8x8 的回复:
*p = *0x12ff7c //就是说p = 0x12ff7c
//*0x12ff7c应该就是 0x1000
是这个意思吗?


和正常的想法不一样哦,建议你编下就知道问题在哪里了
[/Quote]
int * p;//的意思是定义一个名字为p的 int*类型变量 对p赋值的是 int *类型的变量 其值为0x12ff7c没错把? 0x12ff7c强制转换成一个int类型的值 其值就是0x12ff7c 所以p就等于 0x12ff7c
你的意思是这样正常把?
那么你的思路也真复杂(汗!)
也就是说 p 是0x12ff7c的引用 或别名
pathuang68 2011-06-02
  • 打赏
  • 举报
回复

#include "stdio.h"

void main(int argc,char** argv)
{

int *p = (int *)0x12ff7c; //这个地址经过验证,可以访问
*p = 0x1000;
printf("The value at p is : %x\n",*p); // 输出1000,如果0x12ff7c这个地址可以写的话
}
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 p8x8x8 的回复:]
*p = *0x12ff7c //就是说p = 0x12ff7c
//*0x12ff7c应该就是 0x1000
是这个意思吗?
[/Quote]

和正常的想法不一样哦,建议你编下就知道问题在哪里了
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kyotrue 的回复:]
同楼上,你想要什么结果?

这个输出的是12ff7c,你要输出1000就要printf("p is : %x\n",*p);
[/Quote]

貌似您说反了... 不信可以编译下看看
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q191201771 的回复:]
printf("%d\n", *p);
printf("p is : %x\n",p);

另外不要这样直接访问地址, 而且还是写操作
你如何经过的验证?
[/Quote]
验证方法是 先定义个int型变量 取其地址 就用这个地址做赋值
aozhi 2011-06-02
  • 打赏
  • 举报
回复
显示地址
printf("p is : %x\n",p);
显示内容
printf("p is : %x\n",*p);
chrislin3217 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
你想要什么结果
[/Quote]

我想打印的p的地址,但是得到的却是p指向的值,而且printf("p is : %x\n",*p);编译通过,但执行会出现错误。
加载更多回复(6)

69,374

社区成员

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

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