----------------解决方案--------------------------------------------------------
我觉得极光说的对啊!具体我也解释不了!水平有限啊!~
----------------解决方案--------------------------------------------------------
恩 你学要 学习 的 还很多 尤其是
被人告诉你答案不接受 你这么学的 话就是 一个 好学生了
活到老学到老 不停地学 还是不会 继续学 不会
然后死循环
我不是打击你
这个错误就是函数调用完 释放内存空间 出什么 结果那说不好 谁让现在是 多进程操作系统呢 出乱码就对了
出不是乱码就是巧合 回答完毕
----------------解决方案--------------------------------------------------------
想帮忙,可无能为力
----------------解决方案--------------------------------------------------------
谢谢各位,有个牛人看过这个汇编了,和夜火说的差不多,谢谢各位哦还是要
----------------解决方案--------------------------------------------------------
关于楼主
在局部函数里P被赋予a首地址,但是由于函数被执行后内存空间被释放,此时这段内存空间里的数据是不可预知的。至于为什么依然可以在主函数里输出,这是因为返回的P依然是指向一个地址的,它能被printf引用。
若需要使局部函数里申请的内存不被释放,应当使用p=malloc()来分配。这样退出函数后这段内存可以正常引用。
----------------解决方案--------------------------------------------------------
好的,谢谢!!
----------------解决方案--------------------------------------------------------
同意9楼和13楼
----------------解决方案--------------------------------------------------------
没想到在这里挖到一个好帖子,楼主的精神值得赞扬,勇于探索,不过基础不够扎实所以猜测是错误的。
再看一次这个有意思的程序:
程序代码:
#include <stdio.h>
char *test(char *p)
{
int i;
char a[100]="I love you!";
p=a;
//这里的printf就是问题的关键,保留时main函数中输出正常,注释后就会出错。
// printf("%s\n",p);
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
要想让main中的printf输出char *test(char *p)中的字符串不是必须在test中加printf,只需要在test返回前任何时刻调用任何io函数,所以可以是main中调用test前,也可以是test中调用。
再看这个程序:
程序代码:
#include <stdio.h>
char *test(char *p)
{
int i;
char a[100]="I love you!";
p=a;
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
puts("此次IO后可以正常输出I love you!,注释本行后输出出错");
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
进程堆栈是由进程控制的,每个线程都有一个堆栈,堆栈完全由程序员控制,只要你不破坏,曾经保留在里头的数据就是完整的。这个程序的堆栈在没有破坏时就可以输出I love you!
至于这个和IO函数的关系,估计没几个人能看出来。
我不妨等一段时间再揭露谜底,看看bccn有没有能人异士可以看出来。
[[it] 本帖最后由 VxWorks 于 2008-5-17 02:49 编辑 [/it]]
----------------解决方案--------------------------------------------------------
假如LZ的编译器是VC6的Debug版本,请运行:
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <stdio.h>
char *test(char *p)
{
char a[354]="I love you!";
p=a;
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <stdio.h>
char *test(char *p)
{
char a[354]="I love you!";
p=a;
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
和:
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <stdio.h>
char *test(char *p)
{
char a[90]="I love you!";
p=a;
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
puts(p);
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
#include <stdio.h>
char *test(char *p)
{
char a[90]="I love you!";
p=a;
return(p);
}
int main(void)
{
char *p, *q;
p="there is a example";
puts(p);
q=test(p);
printf("\n截后的串为:%s\n",q);
return 0;
}
----------------解决方案--------------------------------------------------------