为什么在传递int(不是int *)作为scanf()的参数时,编译器没有发出错误?

udit043

我尝试了下面的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(垃圾值)。

苏拉夫·戈什(Sourav Ghosh)

根据C11标准,第§6.3.2.3章

整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。

因此,编译器将允许这样做,但是结果是实现定义的。

在这种特殊情况下,您将传递b未初始化scanf()的参数作为参数,一旦执行该参数,将导致程序调用未定义的行为

同样,printf()/scanf()是可变参数函数,一般不对参数类型进行检查,除非通过编译器标志明确要求[请参见-Wformat]。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

传递Set [List [Int]]类型的值而不是List [Int]-为什么这样做有效?

这是为什么int数组而不是作为一个对象变量参数数组传递?

在cython中传递float而不是int时,为什么不出现类型错误

为什么在将main声明为`int main(void)`时传递命令行参数时没有错误?

为什么函数brk()的参数为void *而不是int类型?

为什么Go中有int而不是float?

为什么编译器将“ char”与“ int”而不是“ short”匹配?

为什么系统不加警告地接受作为int参数传递的long int?

为什么对于char,编译器为什么更喜欢int重载而不是varargs char重载?

为什么编译器没有给出冲突的错误?

为什么按名称调用参数期望使用Int类型的参数,而不是()=> Int类型

为什么当将 void 传递给 int 数组时它不起作用我的编译器说“错误:初始化程序无效”

为什么[[_:Int)/(_:Int))不能编译((_:Int,_:Int)=> _ / _)?

当在int main()之前而不是在int之前声明函数时,为什么函数起作用?

为什么int = int * double给出错误而int * = double却没有(在Java中)?

为什么在某些编译器中可以声明一个数组,例如int myarr [noconstant]; 而不是别人?

为什么numpy.core.numeric._typelessdata中有两个np.int64(为什么numpy.int64不是numpy.int64?)

当我有两个函数时,为什么编译器不显示错误,一个将基类作为参数,一个将派生类作为参数?

当没有闭包时,为什么编译器为委托添加一个额外的参数?

为什么int i = 1024 * 1024 * 1024 * 1024编译时没有错误?

使用ArrayList <String []>而不是int [] []时,为什么会出现超时限制(TLE)错误?

为什么我可以在没有编译器错误的情况下将错误的接口传递给函数?

为什么我可以将一个Int分配给一个没有编译器错误的字符串?

为什么在期望F [_]参数有效的地方传递Int?

为什么 0b1111_1111 会导致编译器错误“int 无法转换为字节”而不是 0b111_1111?

如果结果必须为int,为什么Java编译器为什么允许int / int除法?

使用无符号而不是带符号的int更有可能导致错误吗?为什么?

为什么Java编译器不喜欢原始int作为HashMap中值的类型?

为什么在C#中未处理Delegate中的返回值时没有编译器错误抛出?