gpt4 book ai didi

c - 为什么 GCC/Clang 在不同情况下的初始化行为不同?

转载 作者:行者123 更新时间:2023-11-30 18:31:44 25 4
gpt4 key购买 nike

我使用 GCC 和 Clang/LLVM 尝试了以下版本的代码:

版本 1

#include <stdio.h>    
main() {
work();
return 0;
}
work() {
int b;
printf("b: %d \n", b);
}

版本 2

#include <stdio.h>    
main() {
work();
return 0;
}
work() {
int a = 1;
int b;
printf("a: %d b: %d \n", a, b);
}

版本3

#include <stdio.h>    
void work() {
int a = 1;
int b;
printf("a: %d b: %d \n", a, b);
}
int main(int argc, char** argv) {
work();
return 0;
}

对于海湾合作委员会,

版本 1 输出 b: 0

版本 2 输出 a: 1 b: 4195728

版本 3 输出 a: 1 b: 1742650088

对于 Clang (LLVM),

版本 1 输出 b: 0

版本 2 输出 a: 1 b: -1643302816

版本 3 输出 a: 1 b: 0

我在几台机器上多次运行相同的代码。产生“0”的始终生成“0”,也就是说,在这些情况下,b 已初始化。

问题:

  1. 是什么让 GCC 和 Clang 在版本 1 中始终生成“0”?

  2. 是什么让 Clang 在版本 3 中总是生成“0”?

最佳答案

读取从未初始化且从未获取地址的变量具有未定义的行为。这意味着编译器实现者可以选择任何喜欢的东西。因此,如果您真的有兴趣,请直接询问实现者,而不是我们。但正如帕斯卡所说,我认为他们不会对你的问题很感兴趣,而且我也怀疑你可能会在他们的文档中找到任何有趣的东西。但由于这些是开源编译器,您可以查看源代码以了解它们在做什么。

本质上,你不能期望从你的代码中得到任何有意义的东西。

如果您对编译器及其要告诉您的内容非常感兴趣,请至少为您的代码打开一些警告(使用 -Wall)。根据现代标准,您拥有的前两个版本甚至都不是 C。

关于c - 为什么 GCC/Clang 在不同情况下的初始化行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20879537/

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