gpt4 book ai didi

c - undefined variable 和编译器优化

转载 作者:太空宇宙 更新时间:2023-11-04 00:45:41 24 4
gpt4 key购买 nike

我对 undefined variable 和下面演示的代码片段有疑问:

func_1() 之后 --- 它会将 A 压入堆栈并将该内存的值设置为 40,然后弹出 A 出栈。

func_2() 之后 --- 它会再次将 A 压入堆栈并继承之前设置的值,打印出的值为 40。

void func_1()
{ int A = 40;}

void func_2()
{ int A; printf("%d/n",A);}

void main (void)
{
func_1();
func_2();
}

如果我们将func_2()中的名称A改成B来测试栈的使用,并把额外的代码放在里面测试命名变量池的使用:

int A; printf("%d\n", A);

在我的电脑上,它说 B 是 40,A 是 0。

我想知道的是,如果编译器有一个命名变量池,它可以重复使用这些变量来帮助优化编译代码(?),那么为什么我在 A 上得到 0?编译器什么时候使用池?

我的问题基于这张幻灯片: http://www.slideshare.net/olvemaudal/deep-c/131-I_am_now_going_to

最佳答案

很可能函数 func_2(); 中的变量 A 被分配在与值 40 相同的堆栈位置(在func_1())。由于您尚未在 func_2() 中初始化变量,因此在这种情况下,它将使用内存中的随机值打印变量 40 (因为它从未被覆盖).这类似于用户释放指针然后声称他们之后也能看到其内容的情况,尽管他们可能会或可能不会看到该值,但该行为被认为是未定义。不用说,您不应该依赖这种行为!

我做了一个简单的测试,证明它与变量名无关:

void func_1()
{
int A = 40;
int B = 10;
printf("Memory A = %p Memory B = %p\n",&A, &B);
}

void func_2()
{ int B; printf("B = %d Memory B = %p\n",B, &B);}

void main (void)
{
func_1();

func_2();
printf("\n");
}

输出:

Memory A = 0x7fff58f86b5c Memory B = 0x7fff58f86b58
B = 40 Memory B = 0x7fff58f86b5c

如您所见,尽管 func_1() 中的 B = 10func_2() 中的打印值为 40。为什么?如果检查func_1()中变量A的内存地址是0x7fff58f86b5c,则变量B<占用的内存地址相同func_2() 中。

关于c - undefined variable 和编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082317/

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