gpt4 book ai didi

c - 这个C代码有什么问题

转载 作者:太空狗 更新时间:2023-10-29 16:39:52 26 4
gpt4 key购买 nike

我有一段代码试图返回 *ptr 指向的值的平方。

int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}

main()
{
int a=8,t;
t=square(&a);
printf("%d",t);
}

它对我来说工作正常,但这段代码的作者说它可能因为以下原因而无法工作:
因为 *ptr 的值可能会意外更改,所以 a 和 b 可能不同。因此,此代码可能会返回一个不是正方形的数字!。正确的做法是

long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a;
}

我很想知道他为什么这么说?

最佳答案

volatile 关键字的想法正是向编译器表明,标记为此类的变量在程序执行期间可能会以意想不到的方式发生变化。

然而,这并没有使它成为“随机数”的来源——它只是建议编译器——负责实际改变变量内容的应该是另一个进程、线程、一些硬件中断——任何会写入处理内存,但未内联在 volatile 声明所在的函数中。在“旧时代”(魔法较少的编译器),它所做的一切都是阻止编译器将变量值缓存在一个 CPU 寄存器中。我不知道由现代编译器触发的优化/反优化策略 - 但它至少会这样做。

在没有任何此类外部因素的情况下,“易变”变量与其他任何变量一样。实际上 - 它就像任何其他变量一样 - 因为未标记为 volatile 的变量也可以通过相同的外部原因进行更改(但在这种情况下编译的 C 代码不会为此做好准备,这可能会导致使用不正确的值) .

关于c - 这个C代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8880144/

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