我正在学习指针基础知识.请查看我的示例代码并告诉我发生了什么.
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)
请解释一下..
你可以看到输出是因为你指定的地址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,并且您已声明/定义它不返回值.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |