我有两个不同输出的代码。需要一个很好的解释,它是如何在内存中工作的。
#include "stdafx.h"
int *fun(int *j)
{
*j++;
return j;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 10;
int *j,*k;
j = &i;
k = fun(j);
printf("Now the value = %d",i);
printf("Now the value = %d",*j);
printf("Now the value = %d",*k);
return 0;
}
这里的输出是:10,10和 - (某些值)。
如果我按照以下方式更改括号:
#include "stdafx.h"
int *fun(int *j)
{
(*j)++;
return j;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 10;
int *j,*k;
j = &i;
k = fun(j);
printf("Now the value = %d",i);
printf("Now the value = %d",*j);
printf("Now the value = %d",*k);
return 0;
}
这里的输出是:11,11,11
这是我在Visual studio中做的。请给出一个很好的解释。谢谢。
答案 0 :(得分:1)
这里的问题是operator precedence。因为后缀++
运算符的优先级高于解除引用运算符*
,所以对指针进行增量而不是取消引用的值。
因此该函数返回增加的指针,该指针现在指向其他位置,因此k
中main
的取消引用将是未定义的行为。
答案 1 :(得分:0)
*j++;
return j;
这会增加指针j
,然后返回递增的指针。有两种方法可以解释*j++
:增加j
或增加*j
。但是因为后增量++
具有higher precedence而不是指针去引用,所以解释是增加j
。
请注意,此版本程序的行为未定义,因为无法保证您返回的指针有效。当你运行这个版本的程序时,任何事情都可能发生。
(*j)++;
return j;
这里括号指定要使用的解释,并覆盖优先规则。此代码会增加j
指向的值,而不会修改j
。因此return
语句返回原始指针。此版本的代码至少表现出明确定义的行为。