C 为什么这是指针的输出?

C 为什么这是指针的输出?,c,pointers,C,Pointers,我的教科书中有一个问题,询问以下代码片段的输出是什么: #include<stdio.h> int main() { int arr[3] = {2, 3, 4}; char *p; p = arr; p = (char*)((int*)(p)); printf("%d, ", *p); p = (int*)(p+1); printf("%d", *p); return 0; } #包括 int main() { i

我的教科书中有一个问题,询问以下代码片段的输出是什么:

#include<stdio.h>

int main()
{
    int arr[3] = {2, 3, 4};
    char *p;
    p = arr;
    p = (char*)((int*)(p));
    printf("%d, ", *p);
    p = (int*)(p+1);
    printf("%d", *p);
    return 0;
}
#包括
int main()
{
int-arr[3]={2,3,4};
char*p;
p=arr;
p=(char*)((int*)(p));
printf(“%d,”,*p);
p=(int*)(p+1);
printf(“%d”,*p);
返回0;
}
选项:

A.2、3

B.2,0

C.2,垃圾值

D.0,0

根据教科书,答案是
B
,但我很困惑——有人能解释一下原因吗?

警告:有些问题相当简单

这是关于内存布局的。当您定义
arr
时,它是一个
int
数组,在内存中如下所示:

2,3,4

但是每个
int
都有四个
char
s长。因此,当作为
char
数组查看时,它看起来如下所示:

2,0,0,0,3,0,0,0,0,4,0,0,0,0


由于
p
的类型为
char*
,将一个指针添加到
p
会使指针向前移动一个指针,就像在第二个透视图中一样。因此,您得到了这个输出。

那么,出了什么问题?你期待什么?你自己是怎么回答这个问题的?你最喜欢的C语言书怎么说?你不明白的具体是什么?问之前你试过什么吗?对于这种类型的问题,你很难确定自己到底不理解什么,甚至更难确定要搜索哪些关键字。学习整个C语言显然仍然可以回答他们的问题,但似乎有点不成比例。在你看来,他们应该尝试什么?不,是关于调用未定义的行为。1)你不是刚刚评论了一个事实,即你似乎不确定问题到底是关于什么的吗?2) 请详细说明。您引用了哪些未定义的行为?1)为什么这会改变问题?顺便说一句,我没有评论这个问题不清楚,只是不清楚OP具体要求什么。您可能需要查看问题规则。显然这是另一个“我懒得去钓鱼,给我鱼”的问题。2) 好吧,这是你的答案,不如了解一下你自己吧?1a)这并不能改变问题,我只是好奇而已。1b)在我看来,这不像是一个问题,但我承认你可能对此有更多的经验,这意味着我会继续思考。2) 我现在还有很多事情要做,但我以后可能会再看一遍。@HermannDöppes:你的答案是假设没有什么持久性,不是吗?