无论我阅读多少主题,我都无法理解评估策略。你能用一个例子向我解释三个评估订单吗?我正在编写下面的代码。您能否按需要解释呼叫(懒惰评估),按名称呼叫(正常订单评估),使用下面的代码通过引用进行调用。你也可以用你的例子来解释它们。我想要的只是理解它们,但我无法理解。
int a[4] = {10,20,30,40};
int i = 0;
int *p;
void test(int x, int y, int z)
{
p = (int *)malloc(sizeof(int));
*p=x;
x++; y++; z++;
p = &z;
printf("%d %d %d\n",x,y,z);
x++; y++; z++;
p = &z;
printf("%d %d %d\n",x,y,z);
}
main()
{
test(i,a[0],a[i]);
printf("%d %d %d %d %d\n", a[0],a[1],a[2],a[3],*p);
}
提前致谢。
}
答案 0 :(得分:1)
这里没有懒惰,因为受影响的一切都是通过值传递的,并且全局指针永远不会被解除引用,直到未定义的行为这样做(指向已经返回的函数的局部变量的指针) )。
编程行为,使用与调试器监视列表中显示的相应表达式的值。请注意*p
是一个表达式,而不是变量:调试器会懒惰地评估它,但它不是真正存在于内存中的东西。
i
,a[0]
和a[i]
到0
,10
和10
。p = (int *)malloc(sizeof(int));
- > {x,y,z,p,* p} = {0,10,10,(某处在堆上),(未初始化)} *p=x;
- > {x,y,z,p,* p} = {0,10,10,(某处堆),0} x++; y++; z++;
- > {x,y,z,p,* p} = {1,11,11,(堆在某处),0} p = &z;
- > {x,y,z,p,* p} = {1,11,11,& z,11}(内存泄漏,malloc'd内存的地址被“遗忘”而未被释放)printf("%d %d %d\n",x,y,z);
显示1 11 11
x++; y++; z++;
- > {x,y,z,p,* p} = {2,12,12,& z,12} p = &z;
没有变化,p已经指向z。printf("%d %d %d\n",x,y,z);
显示2 12 12
p
现在是一个悬垂的指针!当你取消引用它时,任何事情都可能发生。10 20 30 40 12
事实上,指针实际上并不用于演示指针在这里是如何工作的:它有很多浪费的潜力。就指针而言,这是一个糟糕的示例代码。