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:你的答案是假设没有什么持久性,不是吗?