| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3222 人关注过本帖
标题:关于printf函数.大家请看看.............
只看楼主 加入收藏
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我基础也有缺陷..也不知道问什么,呵呵,知道的说下啊...谢谢

学习需要安静。。海盗要重新来过。。
2008-05-14 11:26
moonlight锦
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-5-14
收藏
得分:0 
我觉得极光说的对啊!具体我也解释不了!水平有限啊!~
2008-05-15 17:40
夜火
Rank: 1
等 级:新手上路
帖 子:149
专家分:0
注 册:2007-5-30
收藏
得分:0 
   你学要 学习 的 还很多  尤其是  

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

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

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

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

2008-05-15 17:59
bianchengfeng
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2008-3-1
收藏
得分:0 
想帮忙,可无能为力
2008-05-15 19:57
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
谢谢各位,有个牛人看过这个汇编了,和夜火说的差不多,谢谢各位哦还是要

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-05-15 23:03
xiaolu192
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-11-15
收藏
得分:0 
关于楼主
在局部函数里P被赋予a首地址,但是由于函数被执行后内存空间被释放,此时这段内存空间里的数据是不可预知的。
至于为什么依然可以在主函数里输出,这是因为返回的P依然是指向一个地址的,它能被printf引用。
若需要使局部函数里申请的内存不被释放,应当使用p=malloc()来分配。这样退出函数后这段内存可以正常引用。
2008-05-16 05:34
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
好的,谢谢!!

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-05-16 09:29
Q1007665007
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-5-16
收藏
得分:0 
同意9楼和13楼

QQ1007665007
QQ群61762856
2008-05-16 09:38
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
没想到在这里挖到一个好帖子,楼主的精神值得赞扬,勇于探索,不过基础不够扎实所以猜测是错误的。

再看一次这个有意思的程序:
程序代码:
#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]]

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-05-17 02:46
Q1007665007
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-5-16
收藏
得分:0 
假如LZ的编译器是VC6的Debug版本,请运行:
/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http:// **
*****************************************************************/
#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:// **
*****************************************************************/
#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
快速回复:关于printf函数.大家请看看.............
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070860 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved