首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于printf函数的有关问题。

2012-02-23 
一个关于printf函数的问题。。。。。。关于printf函数.大家请看看.............今天偶尔看到这么个程序:#include

一个关于printf函数的问题。。。。。。
关于printf函数.大家请看看.............
今天偶尔看到这么个程序:
#include <stdio.h>

char *test(char *p)
{
  int i;
  char a[100]="I love you!";
  p=a;
  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;
}

如果这样运行,程序会输出两个"I love you!";
但是,如果你把test函数里面的printf语句注释掉,那么程序将会输出乱码.

我大胆作了个猜测如下:
如果你不加printf在test里面,那么由于在test函数运行期间,a有定义,而在其结束之后,a将是未定义的,所以p也就是未定义的,亦即返回值是未定义的,所以,主函数会输出乱码.
如果你加printf在test里面,由于prinitf叫做"格式化输出语句",所以我想,问题是不是"格式化"引起的.因为格式化,所以printf 会按%s,也就是字符串的格式来格式p,在该语句执行之后,p就变成了一个字符串,而返回值也就变成了指向该字符串的首地址.所以主函数会正确运行.

各位,兄弟我也是个新手,不知道所作的猜测是否正确.所以,请各位明白该问题的指教,谢谢!!!!!

就当作是对一个新手的支持!!!!!!!!!!!

[解决办法]
局部变量的指针,出了函数它指向哪里都可以了,研究它无意义
[解决办法]
跟printf无关的
你把char a[100]="I love you!"; 改成char a[] = "I love you!"试试就知道了
[解决办法]

C/C++ code
#include "stdafx.h"#include <stdio.h>char  *test(char *&p) {     int i;     char *a = "I love you!";     p=a;     //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; }
[解决办法]

你看一下相应的汇编代码就知道了
test函数的返回值存放在eax中,eax指向的是栈中的某个地址值(char a[]的地址值)
实际上返回的时候test函数中的变量对应的栈已经无效了
再执行其它函数的时候,比如printf,极有可能会用到刚才test函数的那些栈地址,于是char a[]的地址的那些东西也被覆盖掉了
没被覆盖掉算你运气
[解决办法]
char a[100]="I love you!"; 
这句话实现的是将常量字符串拷贝到数组a[100]中,a[100]是个局部的,出了函数char *test(char *p) 就被释放了。所以即使你将数组的首地址作为参数返回,这个地址所指向的内容也是不对的了。
但是如果你将这句话改成char *a="I love you!"; 就没有问题了,因为用指针指向一个常字符串,是不会有数组的拷贝过程的,所以这个常字符串始终存在,函数返回指针a指向的地址,所以在main()中输出就是正确的!
[解决办法]
楼主不用猜了,
加printf只是凑巧让返回的p指向的数据保持了test函数运行的数据未被覆盖。

[解决办法]
mark

热点排行