gpt4 book ai didi

c - 与指针相关的 Tricky C 练习。需要帮助来理解解决方案

转载 作者:太空狗 更新时间:2023-10-29 15:45:50 27 4
gpt4 key购买 nike

考虑以下代码:

int *foo (int x) {
int a[2];
a[0] = x;
a[1] = x + 1;
return a;
}

int *p1 = foo(2);
int *p2 = foo(3);

在此代码段结束时,以下各项的值是多少? (给出答案)

 p1[0] = 3
p1[1] = 4
p2[0] = 3
p2[1] = 4

由于 a 是在堆栈上分配的,因此当调用返回时,内存不会保持分配状态,并且可能会被其他东西重用。在这种情况下,由于 foo(3) 在 foo(2) 之后以相同的调用深度被立即调用(即它们使用相同的堆栈空间),它们将返回相同的指针——即 p1 等于 p。

我没看懂上面的解释。这到底是什么意思?为什么 p2 和 p1 的值完全相同?我知道你不能在 C 中返回一个指向局部变量的指针..但我不明白为什么 p2 和 p1 具有相同的值....

最佳答案

在其作用域之外使用指向自动存储变量(作用域为函数的变量)的指针是未定义的,这就是为什么你应该永远这样做,并且永远不要依赖于它的行为。

但是,如果你想在编译器/机器/操作系统上揭开盖子,原因是自动存储恰好分配在两个函数调用的相同地址。

一个例子...

#include "stdio.h"

int* foo(int x) {
int a[2];

printf("&a[0] = %p\n", &a[0]);
printf("&a[1] = %p\n\n", &a[1]);

a[0] = x;
a[1] = x + 1;

return a;
}

int main(int argc, char* argv[]) {

printf("foo(2)\n");
int* p1 = foo(2);

printf("foo(3)\n");
int* p2 = foo(3);

printf("p1[0] = %i\n", p1[0]);
printf("p1[1] = %i\n\n", p1[1]);

printf("p2[0] = %i\n", p2[0]);
printf("p2[1] = %i\n", p2[1]);

return 0;
}

输出...

foo(2)
&a[0] = 0x7fff4dd0f054
&a[1] = 0x7fff4dd0f058

foo(3)
&a[0] = 0x7fff4dd0f054
&a[1] = 0x7fff4dd0f058

p1[0] = 3
p1[1] = 4

p2[0] = 3
p2[1] = 4

因此,&a[0]&a[1]foo(2)foo 中具有相同的地址(3).

实际情况是,当您输入一个函数时,它通常会创建一个堆栈帧(通过在 x86 上递减堆栈指针)。这会在堆栈上为自动存储变量分配内存。当你离开函数时,栈帧被销毁(栈指针返回到它的原始值)。因此,如果您再次进入相同的函数,您通常会为堆栈帧使用相同的内存(堆栈指针递减为与上次调用函数相同的值)。

关于c - 与指针相关的 Tricky C 练习。需要帮助来理解解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26644902/

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