我正在学习指针基础知识。请查看我的示例代码并告诉我发生了什么。
void main()
{
int i, *j;
i = 2;
j = i;
printf("%d", j);
printf("\n%d", j + 1);
printf("\n%d", j + 2);
}
我的输出是
2 6 10
请解释我..
答案 0 :(得分:5)
您看到的输出是因为您在编写0x02
时将地址j
指定给指针j + 1
,您将其递增1
与递增它的相同sizeof(int)
或sizeof(*j)
的地址相同。
但是行为实际上是未定义的commented here最初是Filipe Gonçalves,而my question - here由Kninnug
回复C11 §6.5.6/ 8:
[..]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出;否则,行为未定义。 [..]
您可以查看官方文档以了解更多信息。
此外,您的printf()
调用是未定义行为的原因。您应该使用%p
说明符打印指针并将指针强制转换为void *
,如果您希望赋值正确,则还应将地址强制转换为int *
以使其正常工作
如果您的系统是64位,则将i
转换为(int *)
可能也不够。
该行
j = i;
如果您取消引用j
,可能会导致未定义的行为。
你不应该用指针指定一个整数,也许你的意思是
j = &i;
否则启用编译警告,编译器应警告您错误的分配,尽管它有效不正确。
注意:main()
返回int
,您已将其声明/定义为未返回值。