没想到在这里挖到一个好帖子,楼主的精神值得赞扬,勇于探索,不过基础不够扎实所以猜测是错误的。
再看一次这个有意思的程序:
复制内容到剪贴板代码:
#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有没有能人异士可以看出来。
[
本帖最后由 VxWorks 于 2008-5-17 02:49 编辑 ]