[问题] 求问一题指标题输出

楼主: ericerix (Ponwar)   2021-07-22 22:08:32
开发平台(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
也点摸不著头绪啊!!
作者: nh60211as   2021-07-22 22:28:00
https://wandbox.org/permlink/YC4vQWlolr41CYohint* p 已经指到 a[] 的外面了
作者: sarafciel (Cattuz)   2021-07-22 23:32:00
a不是指标 a是int[5], &a是pointer to int[5]sizeof(int[5])是20byte 所以这边&a+1直接多20byte超界
作者: loveme00835 (发箍)   2021-07-23 00:37:00
你知道为什么拿掉转型 (int*) 会吐 warning 吗? 还是你不知道为什么要这样写?
作者: lgen7604   2021-07-23 01:19:00
我猜原始程式是不是要把 (*p-1) 改成 *(p-1)?

Links booklink

Contact Us: admin [ a t ] ucptt.com