gpt4 book ai didi

c - scanf ("%d",i) 如何工作?

转载 作者:行者123 更新时间:2023-11-30 19:53:37 24 4
gpt4 key购买 nike

考虑这个代码片段(我故意使用 scanf("%d", i),而不是使用 scanf(%d,&i))

int main()
{
int i;
scanf("%d", i);
printf("%d", i);
return 0;
}

此处 i 未初始化,代码运行时带有警告,扫描输入并给出垃圾值作为输出。

但是如果 i 用某个值初始化,那么它会扫描输入并且程序崩溃。

scanf() 在这两种情况下到底如何工作?

最佳答案

我假设您使用了正确的 #include <stdio.h>只是没有提及。

在这种情况下,只有一行坏线:

 scanf("%d", i); // This line is bad

有两种方法可以调用 Undefined Behavior (UB)这里:

  1. 阅读 i ,即使它从未被分配,也会调用 UB,因为它是自动存储类(堆栈分配)并且您永远不会获取它的地址(它符合 register )。
  2. 通过 int哪里scanf预计int* UB 是由自身引起的。参数应该是 &i .
    如果它“看起来有效”,你知道你可能会在那里破坏什么吗?

您正在初始化i会消除导致 UB 的第一个原因,但不会消除第二个原因。

旁白:您应该始终假设输入可能会失败,因此请检查返回值。

顺便说一句:如果你检查一下,编译器可以并且确实利用 UB 来修剪整个执行分支,这将导致它“不可能,无需担心”。
这是他们用来缩小代码大小并获得最佳性能的常见技巧之一。

如果您想知道您的编译器、您今天使用的版本以及您提供的确切代码和选项的功能,请查看反汇编代码或索取汇编列表。但不要得出任何关于它“无害”的结论。

关于c - scanf ("%d",i) 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com