当前位置: 代码迷 >> C语言 >> 求教指针,地址问题!结果很奇怪~
  详细解决方案

求教指针,地址问题!结果很奇怪~

热度:238   发布时间:2007-04-07 17:57:30.0
求教指针,地址问题!结果很奇怪~

#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啊???

搜索更多相关的解决方案: 指针  地址  结果  

----------------解决方案--------------------------------------------------------
刚看了下高级c++\c语言编程。
发现上述程序有问题。
p并没有指向我想要的s,而是另一个随机的地址。
但是我还是不知道怎么修改。
----------------解决方案--------------------------------------------------------
char *wu()
{
char *s="eee";
return s;
}
如此修改可使运行结果正确。但是如果这样,每次返回的是静态内存,没有从根本上解决问题。

----------------解决方案--------------------------------------------------------

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

内存分配方式
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)指针操作超越了变量的作用范围。


----------------解决方案--------------------------------------------------------

自问自答 ……


----------------解决方案--------------------------------------------------------
没人给我解答。
我查看资料。搞了两个小时才懂。
我也不想的!
----------------解决方案--------------------------------------------------------


----------------解决方案--------------------------------------------------------

我在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();返回的空间已经被覆盖,而得到不可预知的结果.


----------------解决方案--------------------------------------------------------

版主解释的好!
赞一个。


----------------解决方案--------------------------------------------------------
受教了~~~~~~~以前只知道是临时分配,,但说不出个所以然.....
----------------解决方案--------------------------------------------------------
  相关解决方案