| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 483 人关注过本帖
标题:求教指针,地址问题!结果很奇怪~
只看楼主 加入收藏
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
 问题点数:0 回复次数:9 
求教指针,地址问题!结果很奇怪~

#include<stdio.h>
#include<stdlib.h>
char *wu()
{
char s[4];
s[0]='e';
s[1]='e';
s[2]='e';
s[3]='\0';
return s;
}
main()
{ int i,num=0;
char *p=wu();

clrscr();
printf("%c\n",wu()[2]);
printf("%c\n",wu()[1]);
for(i=0;p[i]!='\0';i++)
{
num++; printf("%c\n",p[i]);
}
printf("%d",num);

}

运行结果:num=7
???
按我的目的。num应该等于3才对啊。
为什么是7啊???

搜索更多相关主题的帖子: 指针 地址 结果 
2007-04-07 17:57
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 
刚看了下高级c++\c语言编程。
发现上述程序有问题。
p并没有指向我想要的s,而是另一个随机的地址。
但是我还是不知道怎么修改。

没有解决不了的问题,时间而已!
2007-04-07 18:46
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 
char *wu()
{
char *s="eee";
return s;
}
如此修改可使运行结果正确。但是如果这样,每次返回的是静态内存,没有从根本上解决问题。

没有解决不了的问题,时间而已!
2007-04-07 18:50
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 

再分析:
第一次之所以出现不想的结果是因为。
函数在调用后,内存被摧毁。所以返回的地址是随机的。
而第二次,由于申请的是常量字符串,是不会被摧毁的。
至于更好的方法可以用指针的指针来定义函数!
奉献内存学习的笔记。

内存分配方式
1)从静态存储区域分配。如:全局变量、静态变量。
2)在栈上创建。
3)在堆上分配,亦即动态分配。malloc\new分配。用free\delete释放。
常见内在错误:
1)内存分配未成功,却使用了它。
对策。先检查,对参数:入口处用assert(p!=NULL)进行检查。
如用malloc或者new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。
2)内存分配成功,但未初始化就引用它。
3)内存分配成功并有初始化,但操作越界。
4)忘记了释放内存,造成内存泄露。必须配对使用。malloc\free、new\delete。
5)释放了内存却继续使用它。
又分三种情况:1。对象调用关系太复杂,此时应该重写结构。2。return语句写错,不能返回指向“栈内在”的“指针”或者“引用”,该内存会被自动销毁。3。使用了free或者delete后没有将指针设置为NULL。导致产生野指针。
杜绝野指针:
1)指针变量没有被初始化。
2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
3)指针操作超越了变量的作用范围。


没有解决不了的问题,时间而已!
2007-04-07 19:51
zgwxwn
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2006-4-24
收藏
得分:0 

自问自答 ……


coding & enjoying
2007-04-07 20:04
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 
没人给我解答。
我查看资料。搞了两个小时才懂。
我也不想的!

没有解决不了的问题,时间而已!
2007-04-07 23:20
jiangliangju
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-9
收藏
得分:0 

2007-04-08 00:28
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 

我在TC2.0 上运行的结果:
e
e


£
3


char *wu()
{
char s[4];
s[0]='e';
s[1]='e';
s[2]='e';
s[3]='\0';
return s;
}

s是一个局部变量,
在生命周期是随着wu()函数的结束而结束,
当函数结束时,系统会收回为s分配的空间,

printf("%c\n",wu()[2]);的输出结果是'e',
这是因为调用wu()函数时,返回s空间的首地址,而这块空间还没有被其它数据给覆盖.

for(i=0;p[i]!='\0';i++)
{
num++; printf("%c\n",p[i]);
}
结果:


£
这是因为p从wu();返回的空间已经被覆盖,而得到不可预知的结果.


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-04-08 00:52
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 

版主解释的好!
赞一个。


没有解决不了的问题,时间而已!
2007-04-08 08:26
w362034710
Rank: 1
等 级:新手上路
帖 子:169
专家分:0
注 册:2006-12-2
收藏
得分:0 
受教了~~~~~~~以前只知道是临时分配,,但说不出个所以然.....
2007-04-08 10:30
快速回复:求教指针,地址问题!结果很奇怪~
数据加载中...
 
   



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

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