繁体   English   中英

如果我在 scanf 中传递变量值而不是变量引用会发生什么?

[英]What happens if I pass a variable value instead of a variable reference in scanf?

我有这个代码:

int a;

scanf("%d", &a);

printf("You entered: %d", a);

这工作得很好,但我想知道如果我传递变量值而不是像scanf("%d", a)这样的scanf中的变量引用会发生什么。

我没有从编译器得到错误,但也没有 output 。 这里发生了什么?

在 scanf 中, "%d"期望一个指向int的指针,这意味着一个指向将存储值的变量地址的指针,如果你传递a你将只是传递int没有办法存储值,因为scanf赢了不知道在哪里。

这样做将调用未定义的行为

基本上 & 是一个返回操作数地址的运算符。 如果你在 scanf 中给出不带 & 的变量 a,它将按值传递给它,这意味着 scanf 将无法设置它的值供你查看。 通过引用传递它 - 使用 & 实际上传递一个指向 a 的指针 - 允许 scanf 设置它。

scanf期望与%d转换说明符对应的参数是int object (类型为int * )的地址 a包含的任何都将被解释为地址1

这样做的行为是未定义的 - 编译器不需要在翻译期间发出诊断,并且运行时环境不需要抛出任何类型的异常。 根据a中包含的值,您可能会遇到运行时错误,或者您可能会破坏另一个数据 object,或者您的代码可能会在没有任何明显错误的情况下运行,或者可能会发生完全不同的事情。


  1. 至少在sizeof (int) == sizeof (int *)的系统上 - 对于像 x86_64 这样的系统,情况并非如此,因此scanf会将a之外的字节视为地址的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM