printf()参数是常量和变量有什么区别?

HeBanBei 2012-12-28 09:49:04
1、
char *p="%s";  
printf(p);

2、
printf("%s");


以上两段代码,第一段运行时能通过(虽然显示的怪怪的),第二段运行时出错(根本无显示)。为什么?

...全文
407 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhcosin 2012-12-28
  • 打赏
  • 举报
回复
楼主没搞明白错误的原因,你printf的参数都没给正确,还指望它能给一个明确的结果?
a151141 2012-12-28
  • 打赏
  • 举报
回复
l g
MoreWindows 2012-12-28
  • 打赏
  • 举报
回复
不同编译器表现会不一样吧,楼主试下这段代码会输出什么:

#include <stdio.h>
int main()
{
	char *p = "%s";
	putchar('1');
	printf(p);
	putchar('2');
	printf("%s");
	putchar('3');
	return 0;
}
在XP系统+VC6.0会输出:123 这说明 char *p = "%s"; printf(p); 与 printf("%s"); 等价。
ying0620 2012-12-28
  • 打赏
  • 举报
回复
我觉得是不是因为, 首先因为都是%s,没有提供第二个参数, 当前面定义了一个p这个变量,printf按照参数列表去寻找和%s对应的那个参数,由于没有提供,他实际上又找到了p,于是把p输出了。 而使用常量的时候,调用printf之前可能 定义了其他类型的变量, printf仍然去找%s对应的参数,仍然打印他,可是这次找到的可能不是一个字符串指针,而是把其他变量当成了字符串指针,于是就跑到一个莫名其妙的地方去了。。。
赵4老师 2012-12-28
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c
xumaojun 2012-12-28
  • 打赏
  • 举报
回复
这两个写法好奇怪呀
FancyMouse 2012-12-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
这个不叫未定义行为吧。。 C不做参数检查,printf(char*, ...)的行为只管按照第一个格式字符串,去栈的相应位置取参数,如果实际没参数,就把栈里面的东西当参数输出的,结果是不确定的。但行为是确定的,不该叫未定义行为
标准里没有定义没参数的时候一定要去栈里找脏数据。说未定义没问题。
cfvmario 2012-12-28
  • 打赏
  • 举报
回复
这个不叫未定义行为吧。。 C不做参数检查,printf(char*, ...)的行为只管按照第一个格式字符串,去栈的相应位置取参数,如果实际没参数,就把栈里面的东西当参数输出的,结果是不确定的。但行为是确定的,不该叫未定义行为
东大坡居士 2012-12-28
  • 打赏
  • 举报
回复

char *p="%s";  
printf(p);//这是什么意思?直接传递一个地址给printf
nice_cxf 2012-12-28
  • 打赏
  • 举报
回复
在vs2008下,两种写法运行都会报错,对于未定义行为没有任何研究的必要
HeBanBei 2012-12-28
  • 打赏
  • 举报
回复
引用 1 楼 nice_cxf 的回复:
printf参数不符属于未定义行为,任何结果都有可能 别研究这些没用的了
额,我的问题是:printf()参数是常量和变量有什么区别? 一楼中的例子只是我目前为止唯一能找到两者存在差别的例子。找不到别的例子,只能将就着用。 不过例子不重要,关键是问题。 我之前一直以为printf()参数-常量和变量没有区别。现在通过这个例子不敢肯定了。
nice_cxf 2012-12-28
  • 打赏
  • 举报
回复
printf参数不符属于未定义行为,任何结果都有可能 别研究这些没用的了
14号选手 2012-12-28
  • 打赏
  • 举报
回复
printf("%s",p);
sanae 2012-12-28
  • 打赏
  • 举报
回复
两种用法没区别,不是从一次两次效果上来说,而是从实现上来说用变量或常量,在printf那里的底层应该没区别。但这个有问题的代码为何结果相同或不同,最好是看看反汇编,有问题本来就没很多能解释的,也许只能说编译器对寄存器和栈空间以及指令顺序等的安排不同
HeBanBei 2012-12-28
  • 打赏
  • 举报
回复
引用 5 楼 cfvmario 的回复:
这个不叫未定义行为吧。。 C不做参数检查,printf(char*, ...)的行为只管按照第一个格式字符串,去栈的相应位置取参数,如果实际没参数,就把栈里面的东西当参数输出的,结果是不确定的。但行为是确定的,不该叫未定义行为
你说的栈,是不是指printf()从第二个函数起的参数列表?这时候两种写法栈都应该是空的吧。 另外,请看下十三楼,有新情况。
HeBanBei 2012-12-28
  • 打赏
  • 举报
回复
引用 10 楼 MoreWindows 的回复:
不同编译器表现会不一样吧,楼主试下这段代码会输出什么:
嗯,试了一下,VC跟gcc的确不一样。 在VC中体现不出我这个问题。 不过,我发现了另外一个情况。 就是在printf("%s");语句之前加一个char *p;就会和printf(p);一样了。 那么现在的问题就是: char *p;是如何影响printf("%s");的运行的?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧