标题:[讨论]取地址和取内容时遇到的问题
只看楼主
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
 问题点数:0 回复次数:7 
[讨论]取地址和取内容时遇到的问题
初学C语言,主要是看书然后将例子试一遍。在“运算符—一元变换”那里遇到了问题
原例子是这样:

main()
{
int m,count=100;
m=&count;
printf("%d\n",m);
}

调试时显示 错误 temp.c 5: 非可移动指针转换 在函数 (这里的错误是什么原因造成的?)

于是我改了一下
main()
{
int *m,count=100;
m=&count;
printf("%d,%d\n",*m,m);
printf("%d,%d\n",m,*m);
printf("%d,%d\n",*m,m);
}

调试正常,不过运行时的结果很奇怪
第一行输出 100,4060。这一行应该没问题,前面是count的内容,后面是count的地址
第二行输出 4060,5023。 这就让我搞不懂了?为什么会出现这种结果?
第三行还是 100,4060。也就是说只有 m在*m之前输出时会产生问题。怪哉。

调试环境是mytc5.4.1
搜索更多相关主题的帖子: count printf 地址 main 
2007-09-18 12:01
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
得分:0 
又改了一下
main()
{
int *m,count=100; /*定义m为指针*/
m=&count;
printf("%d,%d,%d,%d\n",*m,m,&count,count);/*输出m的内容,m的地址,count的地址,count的内容*/
printf("%d,%d,%d,%d\n",*m,m,count,&count);/*输出m的内容,m的地址,count的内容,count的地址*/
printf("%d,%d,%d,%d\n",m,*m,&count,count);/*输出m的地址,m的内容,count的地址,count的内容*/
printf("%d,%d,%d,%d\n",m,*m,count,&count);/*输出m的地址,m的内容,count的内容,count的地址*/
printf("%d,%d,%d,%d\n",&count,count,*m,m);/*输出count的地址,count的内容,m的内容,m的地址*/
printf("%d,%d,%d,%d\n",&count,count,m,*m);/*输出count的地址,count的内容,m的地址,m的内容*/
printf("%d,%d,%d,%d\n",count,&count,*m,m);/*输出count的内容,count的地址,m的内容,m的地址*/
printf("%d,%d,%d,%d\n",count,&count,m,*m);/*输出count的内容,count的地址,m的地址,m的内容*/
}

输出结果是:
100,4060,5036,4060
100,4060,5036,100
4060,5036,100,4060
4060,5036,100,100
4060,5036,100,100
4060,5036,100,4060
100,4060,5036,100
100,4060,5036,4060

那个5036到底是从那里冒出来的?最开始是5023,后来变成了5028,现在又变成5036了。

2007-09-18 12:21
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
得分:0 
我用cfree,结果没问题!第二行是先输出地址后输出内容100
2007-09-18 12:23
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
得分:0 
那就是说是tc的问题了?另外问一下,你说没问题,是指原例子说的,还是我改过后的部分说的?

2007-09-18 12:29
chllin
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-9-14
得分:0 
"&"为取指运算符 "&count"为整型变量count的地址,它的类型不是int型,如果换成 int m ,count=100; m=(int)&count; 我相信会通过的 。但后面的"*m"就没有意义了。

main()
{
int *m,count=100;
m=&count;
printf("%d,%d\n",*m,m);
printf("%d,%d\n",m,*m);
printf("%d,%d\n",*m,m);
}
”关于第二个printf语句输出结果问题我说不太清楚,不过在vc++没有出现这个问题。也许跟编译器有关。

2007-09-18 12:47
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
得分:0 
原例子没问题!下面个刚试了也没问题!应该是编译器的问题吧!我用的cfree

[此贴子已经被作者于2007-9-18 12:49:43编辑过]

2007-09-18 12:48
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
得分:0 
按5楼说的方法改了一下,这次没问题了。看样子是数据类型定义的错误。看来我要换个c程序了。有没有什么推荐的?

另:谢谢無邪的睡脸和chllin的帮助。

2007-09-18 13:02
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
得分:0 

由于在printf("%d,%d",m,*m);时,m是一个指针变量,当以整型格式输出的时侯,会造成
printf()的程序中定义这种不稳定状态,然后对*m的输出产生随机输出.(这只是我个人看法).
原程序改成:
#include<stdio.h>
main()
{
int *m=NULL,count=100;
m=&count;
printf("%d,%d\n",*m,(int)m);
printf("%d,%d\n",(int)m,*m);
printf("%d,%d\n",*m,(int)m);
}
就可以了.


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-18 13:59



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-170871-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.404253 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved