printf()参数是恒量和变量有什么区别
printf()参数是常量和变量有什么区别?
1、
2、
以上两段代码,第一段运行时能通过(虽然显示的怪怪的),第二段运行时出错(根本无显示)。为什么?
------解决方案--------------------
在vs2008下,两种写法运行都会报错,对于未定义行为没有任何研究的必要
------解决方案--------------------
------解决方案--------------------
这个不叫未定义行为吧。。
C不做参数检查,printf(char*, ...)的行为只管按照第一个格式字符串,去栈的相应位置取参数,如果实际没参数,就把栈里面的东西当参数输出的,结果是不确定的。但行为是确定的,不该叫未定义行为
------解决方案--------------------
标准里没有定义没参数的时候一定要去栈里找脏数据。说未定义没问题。
------解决方案--------------------
我觉得是不是因为,
首先因为都是%s,没有提供第二个参数,
当前面定义了一个p这个变量,printf按照参数列表去寻找和%s对应的那个参数,由于没有提供,他实际上又找到了p,于是把p输出了。
而使用常量的时候,调用printf之前可能 定义了其他类型的变量, printf仍然去找%s对应的参数,仍然打印他,可是这次找到的可能不是一个字符串指针,而是把其他变量当成了字符串指针,于是就跑到一个莫名其妙的地方去了。。。
------解决方案--------------------
不同编译器表现会不一样吧,楼主试下这段代码会输出什么:
在XP系统+VC6.0会输出:123
这说明
char *p = "%s";
printf(p);
与
printf("%s");
等价。
------解决方案--------------------
两种用法没区别,不是从一次两次效果上来说,而是从实现上来说用变量或常量,在printf那里的底层应该没区别。但这个有问题的代码为何结果相同或不同,最好是看看反汇编,有问题本来就没很多能解释的,也许只能说编译器对寄存器和栈空间以及指令顺序等的安排不同
------解决方案--------------------
1、
char *p="%s";
printf(p);
2、
printf("%s");
以上两段代码,第一段运行时能通过(虽然显示的怪怪的),第二段运行时出错(根本无显示)。为什么?
------解决方案--------------------
在vs2008下,两种写法运行都会报错,对于未定义行为没有任何研究的必要
------解决方案--------------------
char *p="%s";
printf(p);//这是什么意思?直接传递一个地址给printf
------解决方案--------------------
这个不叫未定义行为吧。。
C不做参数检查,printf(char*, ...)的行为只管按照第一个格式字符串,去栈的相应位置取参数,如果实际没参数,就把栈里面的东西当参数输出的,结果是不确定的。但行为是确定的,不该叫未定义行为
------解决方案--------------------
标准里没有定义没参数的时候一定要去栈里找脏数据。说未定义没问题。
------解决方案--------------------
我觉得是不是因为,
首先因为都是%s,没有提供第二个参数,
当前面定义了一个p这个变量,printf按照参数列表去寻找和%s对应的那个参数,由于没有提供,他实际上又找到了p,于是把p输出了。
而使用常量的时候,调用printf之前可能 定义了其他类型的变量, printf仍然去找%s对应的参数,仍然打印他,可是这次找到的可能不是一个字符串指针,而是把其他变量当成了字符串指针,于是就跑到一个莫名其妙的地方去了。。。
------解决方案--------------------
不同编译器表现会不一样吧,楼主试下这段代码会输出什么:
#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");
等价。
------解决方案--------------------
两种用法没区别,不是从一次两次效果上来说,而是从实现上来说用变量或常量,在printf那里的底层应该没区别。但这个有问题的代码为何结果相同或不同,最好是看看反汇编,有问题本来就没很多能解释的,也许只能说编译器对寄存器和栈空间以及指令顺序等的安排不同
------解决方案--------------------
printf("%s",p);