C指针:解释程序概念

Pra*_*ala -4 c pointers

我正在学习指针基础知识.请查看我的示例代码并告诉我发生了什么.

void main()
{
     int i, *j;
     i = 2;
     j = i;
     printf("%d", j);
     printf("\n%d", j + 1);
     printf("\n%d", j + 2);
}
Run Code Online (Sandbox Code Playgroud)

我的输出是

2 6 10
Run Code Online (Sandbox Code Playgroud)

请解释一下..

Iha*_*imi 5

你可以看到输出是因为你指定的地址0x02指针j,当你写j + 1你被递增它1是一样的递增它的地址sizeof(int)或者sizeof(*j)是相同的.

但行为实际上是未定义正如这里评论最初由@ 菲利普贡萨尔维斯,并回答了我的问题 - 在这里通过@ Kninnug

C11 §6.5.6/ 8:

[..]如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.[..]

您可以查看官方文档以了解更多相关信息.

此外,您的printf()调用是未定义行为的原因.您应该使用说明%p符打印指针并将指针强制转换为void *,如果您希望赋值正确,您还应该转换地址以int *使其起作用.

如果您的系统是64位,则转换为ito (int *)可能也不够.

这条线

j = i;
Run Code Online (Sandbox Code Playgroud)

如果您取消引用,可能会导致未定义的行为j.

你不应该指向一个整数指针,也许你的意思

j = &i;
Run Code Online (Sandbox Code Playgroud)

如果启用了编译警告,编译器应该警告您错误的分配,尽管它是有效的,但它不正确.


注意:main()返回int,并且您已声明/定义它不返回值.

  • @iharobC11§6.5.6/ 8:[..]*如果指针操作数和结果都指向同一个数组对象的元素,或者一个超过数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.*[..] (2认同)