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

#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
tvkl
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-4-7
收藏
得分:0 
没人给我解答。
我查看资料。搞了两个小时才懂。
我也不想的!

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

版主解释的好!
赞一个。


没有解决不了的问题,时间而已!
2007-04-08 08:26
快速回复:求教指针,地址问题!结果很奇怪~
数据加载中...
 
   



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

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