由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 看下这个小程序
相关主题
C 语言,初学者,简单问题怎么得到char *分配空间的大小?
A question about class sizechar s[]和char *ps的不同
谁来解释一下这个是compiler问题吗?我也来个。某公司招初级C程序员的面试题。[转载]
free(char *)的问题 (转载)呼叫THRUST等C语言牛牛,菜鸟级C语言指针问题
大家看看这个简单的qsort排序的问题c的问题
再问一个free()的问题这个printf结果是什么?
数组问题关于 big/little endian,为什么对char 有影响?
请教一道C语言的题目在帮忙看看这个吧 C: int->char*
相关话题的讨论汇总
话题: int话题: vfedora话题: ptr话题: 400话题: 20
进入Programming版参与讨论
1 (共1页)
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. 我不太明白

1 (共1页)
进入Programming版参与讨论
相关主题
在帮忙看看这个吧 C: int->char*大家看看这个简单的qsort排序的问题
请教C的类型转换问题再问一个free()的问题
C的问题,困惑中数组问题
C: struct 里面一个CHAR, 一个INT, 这个STRUCT 占多少字节?请教一道C语言的题目
C 语言,初学者,简单问题怎么得到char *分配空间的大小?
A question about class sizechar s[]和char *ps的不同
谁来解释一下这个是compiler问题吗?我也来个。某公司招初级C程序员的面试题。[转载]
free(char *)的问题 (转载)呼叫THRUST等C语言牛牛,菜鸟级C语言指针问题
相关话题的讨论汇总
话题: int话题: vfedora话题: ptr话题: 400话题: 20