为什么写入未初始化的指针不会引发警告?

问题描述

为什么我能够执行以下操作?

char *name;
scanf("%10s",name);
printf("%s\n",name);

程序/编译器没有发出警告?我认为由于 name 指针未初始化,编译器(或可能运行时)会发出警告/错误,说明它正在尝试写入未初始化的内存地址。

解决方法

开启编译器优化。相当多的编译器默认几乎关闭优化,因为它们独立编译每个语句。在这种操作模式下,他们无法判断指针是否未初始化。一般来说,这确实使调试更容易,因为单步检查和修改工作按照您期望的方式进行,但这确实是有代价的。如果你不早点发现它,你会在优化编译时发现它。

同时打开编译器警告。你通常需要 -Wall。

太糟糕了,编译器在进行调试构建时不能用值得出错的垃圾填充未初始化的指针。这样可以节省时间。

,

您需要使用 -Wall -Wextra 而不是仅使用 -Wall 才能在 GCC 中获得“合理”警告

  • -Wextra
    • 这会启用一些 -Wall 未启用的额外警告标志。 (此选项以前称为 -W。旧名称仍受支持,但新名称更具描述性。)

      • ...
      • -Wuninitialized

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html