当前位置: 代码迷 >> C语言 >> 关于printf函数.大家请看看.............
  详细解决方案

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

热度:249   发布时间:2008-05-14 11:26:03.0
我基础也有缺陷..也不知道问什么,呵呵,知道的说下啊...谢谢
----------------解决方案--------------------------------------------------------
我觉得极光说的对啊!具体我也解释不了!水平有限啊!~
----------------解决方案--------------------------------------------------------
恩   你学要 学习 的 还很多  尤其是  

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

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

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

出不是乱码就是巧合 回答完毕
----------------解决方案--------------------------------------------------------
想帮忙,可无能为力
----------------解决方案--------------------------------------------------------
谢谢各位,有个牛人看过这个汇编了,和夜火说的差不多,谢谢各位哦还是要
----------------解决方案--------------------------------------------------------
关于楼主
在局部函数里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[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;
}

----------------解决方案--------------------------------------------------------
  相关解决方案