gpt4 book ai didi

无法理解我书中给出的程序如何得出指针可以从地址中检索值的结论

转载 作者:行者123 更新时间:2023-12-01 23:23:00 24 4
gpt4 key购买 nike

#include <stdio.h>
#include <stdlib.h>

int* test(int); // the prototype

int main()
{
int var = -20;
int *ptr = NULL;
ptr = test(var);
printf("This is what we got back in main(): %d \n", *ptr);
return 0;
}

int* test(int k)
{
int y = abs(k);
int *ptr1 = &y;
printf("The value of y in test() directly is %d \n", y);
printf("The value of y in test() indirectly is %d \n", *ptr1);
return ptr1;
}
The output is:
The value of y in test() directly is 20
The value of y in test() indirectly is 20
This is what we got back in main(): 20

简短摘要:上面提到的代码有一个用户定义的函数,它返回一个保存变量地址的指针(即 y)。该变量被赋予传递给函数的整数的绝对值(即 x)

我在 A.J.Gonzalez 的著作“初学者计算机编程”中指出:函数退出后变量y将不复存在,因此返回给调用函数的地址也将变得毫无意义。然而,保存在其地址中的值将持续存在,并且可以通过指针检索。

我的问题是:我们是如何得出这个结论的,地址中保存的值将持续存在,并且可以通过以下 printf 语句中的指针检索:

第一个陈述:直接使用 y 赋值。

第二条语句:使用指针赋值。

第三条语句:从 main 获取值。

一切都很好,但是从那里如何得出直接使用变量失去其值但间接使用变量(即指针)保留其值的结论?我试着查看过去的问题,但找不到任何相关内容。

将感谢您的帮助。谢谢。

最佳答案

这个程序正在说明 undefined behavior 的效果.

test 返回后,它返回的指针值指向一个不再存在的变量。形式上,这是未定义的行为,这意味着 C 标准不保证当您尝试使用此指针时会发生什么。实际上,y 使用的内存尚未被其他值覆盖,因此取消引用指针通常会产生存储在那里的值。

但同样,也不能保证一定会发生。例如,如果我们按如下方式更改 main 函数:

int main()
{
int var = -20;
int *ptr = NULL;
ptr = test(var);
printf("This is what we got back in main(): %d \n", *ptr);
printf("%d %d %d %f\n", 1, 2, 3, 4.0);
printf("This is what we got back in main(): %d \n", *ptr);
return 0;
}

我的机器输出:

The value of y in test() directly is 20 
The value of y in test() indirectly is 20
This is what we got back in main(): 20
1 2 3 4.000000
This is what we got back in main(): 0

这表明 y 之前使用的内存具有其他一些值(value)。

故事的寓意:不要尝试使用指向不再存在的变量的指针。

关于无法理解我书中给出的程序如何得出指针可以从地址中检索值的结论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67688412/

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