【发布时间】:2021-08-02 22:51:39
【问题描述】:
正如我从this 答案中了解到的,使用未初始化变量的地址在 C 中不是未定义的行为。例如,我可以这样写:
#include <stdio.h>
int main(void) {
char letter;
printf("%p\n", &letter); //prints '0061ff1f'
return 0;
}
但是,如果我编写以下代码:
#include <stdio.h>
int main(void) {
char *letter1;
printf("%p\n", letter1); //gcc issues warning
return 0;
}
gcc 给我以下错误:
C:\...>gcc -Wall -Wextra -pedantic -std=c11 test.c -o main
test.c: In function 'main':
test.c:12:2: warning: 'letter1' is used uninitialized in this function [-Wuninitialized]
printf("%p\n", letter1);
如果我理解正确,未初始化的指针可以指向任何内存地址,这就是为什么使用它通常是个坏主意。但是为什么同样的事情也适用于未初始化的变量,即为什么未初始化的变量不指向任何内存地址,而是指向我们可以安全使用的位置?为什么语言在这方面对待指针变量和普通变量如此不同?
【问题讨论】:
-
“崩溃”是什么意思?使用您的命令,我可以重现警告(以及其他一些警告),但我没有崩溃。第一个示例是未定义字符的地址。第二个是未定义的字符地址。
标签: c undefined-behavior