我尝试了下面的C程序,但我预计会出现编译时错误,但是为什么编译器没有给出任何错误?
#include <stdio.h>
#include <conio.h>
int main()
{
int a,b;
printf("Enter a : ");
scanf("%d",&a);
printf("Enter b : ");
scanf("%d",b);
printf("a is %d and b is %d\n",a,b);
getch();
return 0;
}
我不是写&
在scanf("%d",b)
。在编译时,编译器没有给出任何错误,但是b的执行期间值为2686792(垃圾值)。
根据C11
标准,第§6.3.2.3章
整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。
因此,编译器将允许这样做,但是结果是实现定义的。
在这种特殊情况下,您将传递b
给未初始化scanf()
的参数作为参数,一旦执行该参数,将导致程序调用未定义的行为。
同样,printf()
/scanf()
是可变参数函数,一般不对参数类型进行检查,除非通过编译器标志明确要求[请参见-Wformat
]。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句