H*M 发帖数: 1268 | 1 为什么最后一个输出为400?
好奇怪,我还以为应该是垃圾.
谁给解释下,谢了
这个b在程序里起什么作用?
//test2
//////////////////////////////////////
#include
int main()
{
int a[5]={10, 20, 30, 40, 50};
int b[5]={100, 200, 300, 400, 500};
int *ptr = (int *)(&a+1);
int *t = (int *)(&a -1);
printf("%d %d %d \n", *(a+1), *(ptr-1), *(t+1));
} |
X****r 发帖数: 3557 | 2 这个严格地说的话是undefined,所以什么输出都可能。
现实中如果栈是向下长的话,b放在a之前的地址,那输出就是500。
【在 H*M 的大作中提到】 : 为什么最后一个输出为400? : 好奇怪,我还以为应该是垃圾. : 谁给解释下,谢了 : 这个b在程序里起什么作用? : //test2 : ////////////////////////////////////// : #include : int main() : { : int a[5]={10, 20, 30, 40, 50};
|
H*M 发帖数: 1268 | 3 sorry,忘了写了
是:
假设这些代码运行在intel cpu, 32bit.
integer 四个bytes.
我的输出是400. 我不太明白
【在 X****r 的大作中提到】 : 这个严格地说的话是undefined,所以什么输出都可能。 : 现实中如果栈是向下长的话,b放在a之前的地址,那输出就是500。
|
t****t 发帖数: 6806 | 4 不要管那些垃圾题目了, 这些题换个编译器或者换个优化开关结果都会不一样的, 毫
无意义
【在 H*M 的大作中提到】 : sorry,忘了写了 : 是: : 假设这些代码运行在intel cpu, 32bit. : integer 四个bytes. : 我的输出是400. 我不太明白
|
t****t 发帖数: 6806 | 5 vfedora(156-10:38pm)$ gcc t2.c
vfedora(157-10:38pm)$ a.out
20 50 500
vfedora(158-10:38pm)$ gcc -O2 t2.c
vfedora(159-10:38pm)$ a.out
20 50 123094864
【在 t****t 的大作中提到】 : 不要管那些垃圾题目了, 这些题换个编译器或者换个优化开关结果都会不一样的, 毫 : 无意义
|
t****t 发帖数: 6806 | 6 vfedora(176-10:46pm)$ gcc -m32 t2.c
vfedora(177-10:46pm)$ a.out
20 50 200
vfedora(178-10:46pm)$ gcc -m32 -O2 t2.c
vfedora(179-10:47pm)$ a.out
20 50 134513737
四种编译开关,四个结果,你说出题的人是不是脑残
【在 t****t 的大作中提到】 : vfedora(156-10:38pm)$ gcc t2.c : vfedora(157-10:38pm)$ a.out : 20 50 500 : vfedora(158-10:38pm)$ gcc -O2 t2.c : vfedora(159-10:38pm)$ a.out : 20 50 123094864
|
H*M 发帖数: 1268 | 7 谢谢大侠...
【在 t****t 的大作中提到】 : vfedora(176-10:46pm)$ gcc -m32 t2.c : vfedora(177-10:46pm)$ a.out : 20 50 200 : vfedora(178-10:46pm)$ gcc -m32 -O2 t2.c : vfedora(179-10:47pm)$ a.out : 20 50 134513737 : 四种编译开关,四个结果,你说出题的人是不是脑残
|
e*****n 发帖数: 124 | 8 弱问下第二个为什么是50呢?
【在 H*M 的大作中提到】 : 为什么最后一个输出为400? : 好奇怪,我还以为应该是垃圾. : 谁给解释下,谢了 : 这个b在程序里起什么作用? : //test2 : ////////////////////////////////////// : #include : int main() : { : int a[5]={10, 20, 30, 40, 50};
|
j**4 发帖数: 10425 | 9 co-ask
【在 e*****n 的大作中提到】 : 弱问下第二个为什么是50呢?
|
X****r 发帖数: 3557 | 10 对于T* p的指针运算,p+n == (T*)((char*)p + sizeof(T)*n)
在这里a的类型是int [5],&a的类型就是int (*)[5],所以
ptr = (int*)(&a+1)
= (int *)((char*)&a + sizeof(int [5])*1)
= (int *)((char*)&a + sizeof(int)*5)
= a+5
即*(ptr-1) = *(a+4) = a[4] = 50
【在 j**4 的大作中提到】 : co-ask
|
s******n 发帖数: 21 | 11 Looks like there are 8 bytes padding between a[] and b[] and statck grows
downwords.
so:
b = &a[0] - 20 - 8
t = &a[0] - 20
t = b + 8
so *t = 300
* (t + 1) = 400
【在 H*M 的大作中提到】 : sorry,忘了写了 : 是: : 假设这些代码运行在intel cpu, 32bit. : integer 四个bytes. : 我的输出是400. 我不太明白
|