作者ericerix (我的帅,在於脸)
看板C_and_CPP
标题[问题] 求问一题指标题输出
时间Thu Jul 22 22:08:32 2021
开发平台(Platform): (Ex: Win10, Linux, ...)
macOS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VS code
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无
问题(Question):
求输出
喂入的资料(Input):
无
预期的正确结果(Expected Output):
不知道
错误结果(Wrong Output):
没有错误结果
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://pastebin.com/J3ysYEgV
int main(){
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)(&a + 1);
printf("%d, %d",*(a+1), (*p-1));
return 0;
}
补充说明(Supplement):
最近在读C,看到这一题,
熊熊看看不出端倪,於是喂进去试跑看看,
输出是2, 0,
但上网找,大家都说答案是2,5
第一个是2没什麽争议,有点不太懂为什麽第二个输出是5,我比较认同我的编译器XD
我对int *p = (int *)(&a+1);的理解是这样:取得a这个地址再加1内的值,
而1为int,所以应该是加上4个bytes,
不过,a本身就是一个指标,&a不就是指标的指标吗?但是没有特别去宣告这个指标的指标
所以应该会不合法,因此输出为0合情合理,
但网路上的答案都说是5,
解释是:可把a[5]当成一个二维阵列,只存放一个element,
意即:int a可看成{{1,2,3,4,5}}
所以&a是这个 ^
{{1,2,3,4,5}}
而&a+1是这个 ^
因为没有第二个element,所以答案是5
也点摸不着头绪啊!!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.241.74 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1626962916.A.D4B.html
2F:→ nh60211as: int* p 已经指到 a[] 的外面了 07/22 22:28
所以应该要马undifine要马0是吗?
※ 编辑: ericerix (118.160.241.74 台湾), 07/22/2021 22:31:31
3F:→ sarafciel: a不是指标 a是int[5], &a是pointer to int[5] 07/22 23:32
4F:→ sarafciel: sizeof(int[5])是20byte 所以这边&a+1直接多20byte超界 07/22 23:36
5F:→ loveme00835: 你知道为什麽拿掉转型 (int*) 会吐 warning 吗? 还是 07/23 00:37
6F:→ loveme00835: 你不知道为什麽要这样写? 07/23 00:38
我不太清楚为什麽需要加上转型
我其实是不知道为什麽编译器出来会是0,而网路上大家会说是5,
我认为应该是超界,但我不知道会是什麽答案(超界该怎麽表示?)
※ 编辑: ericerix (118.160.241.74 台湾), 07/23/2021 00:59:11
※ 编辑: ericerix (118.160.241.74 台湾), 07/23/2021 01:13:04
我稍微查了一下,
大概是说a是array第一个element的位址,
而&a是这个array的位址,
所以a, &a是一样的,
pointer如果去+1会是加上这个结构的大小,
所以a+1应会加上4个bytes,也就是到达&a[1],
而&a+1,因为&a代表整个array的头的位址,+1下去会加上整个结构的大小,
所以在这个case会加上20个bytes,也就是会到达类似&a[5]的位址,
会超出a的界线。
但这题是在问,这个位址的内容物大小是多少,
但是我根本不知道超界之後的位址内容长怎样,要如何作答?
照着一楼大大的网址来看,内容应该是全为ff..f?不太清楚
另外我也不知道为何int *p = (int *)(&a+1);这里需要转型
还请高手们替我解答
谢谢大家!
※ 编辑: ericerix (118.160.241.74 台湾), 07/23/2021 01:21:01
7F:→ lgen7604: 我猜原始程式是不是要把 (*p-1) 改成 *(p-1)? 07/23 01:19
这样看起来合理多了XDD 看来是我抄题抄错了(?
不然超界的位址是多少谁知道呢
※ 编辑: ericerix (118.160.241.74 台湾), 07/23/2021 01:22:53