一个关于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!"试试就知道了
[解决办法]
#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