学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
发新话题
打印

关于printf函数.大家请看看.............

我基础也有缺陷..也不知道问什么,呵呵,知道的说下啊...谢谢
学习需要安静。。海盗要重新来过。。

TOP

我觉得极光说的对啊!具体我也解释不了!水平有限啊!~

TOP

恩   你学要 学习 的 还很多  尤其是  

被人告诉你答案不接受  你这么学的 话就是 一个 好学生了

活到老学到老 不停地学  还是不会 继续学 不会
然后死循环

我不是打击你
这个错误就是函数调用完 释放内存空间 出什么 结果那说不好 谁让现在是 多进程操作系统呢 出乱码就对了

出不是乱码就是巧合 回答完毕

TOP

想帮忙,可无能为力

TOP

谢谢各位,有个牛人看过这个汇编了,和夜火说的差不多,谢谢各位哦还是要
前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。

TOP

关于楼主

在局部函数里P被赋予a首地址,但是由于函数被执行后内存空间被释放,此时这段内存空间里的数据是不可预知的。
至于为什么依然可以在主函数里输出,这是因为返回的P依然是指向一个地址的,它能被printf引用。
若需要使局部函数里申请的内存不被释放,应当使用p=malloc()来分配。这样退出函数后这段内存可以正常引用。

TOP

好的,谢谢!!
前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。

TOP

同意9楼和13楼
QQ1007665007
QQ群61762856

TOP

没想到在这里挖到一个好帖子,楼主的精神值得赞扬,勇于探索,不过基础不够扎实所以猜测是错误的。

再看一次这个有意思的程序:
复制内容到剪贴板
代码:
#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 编辑 ]
Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
自从爷成了狗屎,就再也没有人敢踩在爷的头上

TOP

假如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[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;
}
QQ1007665007
QQ群61762856

TOP

发新话题