****讨论下这个题目,请不要先编译***

xiaoQ008 2009-06-03 10:15:04
#include <stdio.h> 
int main()
{
int a[5]={7,8,9,10,11};

int *ptr1=(int *)(&a+1);

int *ptr2=(int *)((int )a+1);

printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
...全文
145 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
die_angle 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 w0911h 的回复:]
引用 5 楼 xiaoQ008 的回复:
引用 3 楼 w0911h 的回复:
再更正一下,int *ptr2=(int *)((int )a+1); 看错了,这里涉及到字节序,对于小顶端的CPU来说,a[0]和a[1]在内存中存储为07 00 00 00 08 00 00 00, (int)a+1后ptr2指向07后的00,取int得值00 00 00 08, 所以*ptr2为0x08000000,同理如果是大顶端的CPU,则结果为0800

同理如果是大顶端的CPU,则结果为0800
貌似大端的话是700h

是的,应该是700h,疏忽了。…
[/Quote]



学习了。。。。
pathuang68 2009-06-04
  • 打赏
  • 举报
回复
学习了,这样的题目考试的时候,还真的需要小心。
mymtom 2009-06-04
  • 打赏
  • 举报
回复
程序会core dump, 还有讨论的价值么?

uname -a && cat love.c && make love && ./love
FreeBSD freebsd.unix-center.net 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 08:43:30 UTC 2007 root@portnoy.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP amd64
#include <stdio.h>
int
main()
{
int a[5] = {7, 8, 9, 10, 11};

int *ptr1 = (int *) (&a + 1);

int *ptr2 = (int *) ((int) a + 1);

printf("%x,%x", ptr1[-1], *ptr2);
return 0;
}
`love' is up to date.
Memory fault (core dumped)
tianqin625 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 rocklad 的回复:]
学习了。
(int)a + 1
就是在地址整数化,+1就是向后移1Byte地址。
小端
0700000008000000
->
00000008000000
0x08000000

大端
0000000700000008
->
000007000000008
0x00000700
[/Quote]

学习了
rocklad 2009-06-04
  • 打赏
  • 举报
回复
学习了。
(int)a + 1
就是在地址整数化,+1就是向后移1Byte地址。
小端
0700000008000000
->
00000008000000
0x08000000

大端
0000000700000008
->
000007000000008
0x00000700
mymtom 2009-06-04
  • 打赏
  • 举报
回复
有问题哦,如果是64位编译器,int 是32位, 指针可是64位的,可能会code dump
tlx20093A 2009-06-03
  • 打赏
  • 举报
回复
恩,学习了!指针之类的程序要加强学习!
w0911h 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaoQ008 的回复:]
引用 3 楼 w0911h 的回复:
再更正一下,int *ptr2=(int *)((int )a+1); 看错了,这里涉及到字节序,对于小顶端的CPU来说,a[0]和a[1]在内存中存储为07 00 00 00 08 00 00 00, (int)a+1后ptr2指向07后的00,取int得值00 00 00 08, 所以*ptr2为0x08000000,同理如果是大顶端的CPU,则结果为0800

同理如果是大顶端的CPU,则结果为0800
貌似大端的话是700h
[/Quote]
是的,应该是700h,疏忽了。。。
xiaoQ008 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 w0911h 的回复:]
再更正一下,int *ptr2=(int *)((int )a+1); 看错了,这里涉及到字节序,对于小顶端的CPU来说,a[0]和a[1]在内存中存储为07 00 00 00 08 00 00 00, (int)a+1后ptr2指向07后的00,取int得值00 00 00 08, 所以*ptr2为0x08000000,同理如果是大顶端的CPU,则结果为0800
[/Quote]
同理如果是大顶端的CPU,则结果为0800
貌似大端的话是700h
lingyin55 2009-06-03
  • 打赏
  • 举报
回复
前几天有个帖子,一样的,
#include <stdio.h>
int main()
{
int a[5]={7,8,9,10,11};

int *ptr1=(int *)(&a+1); ///这个主要是理解&a的类型是一个(int *)[]型的,所以&a+1会偏移一整个数组的长度。

int *ptr2=(int *)((int )a+1); ///这个主要涉及的是大小端的问题。

printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
w0911h 2009-06-03
  • 打赏
  • 举报
回复
再更正一下,int *ptr2=(int *)((int )a+1); 看错了,这里涉及到字节序,对于小顶端的CPU来说,a[0]和a[1]在内存中存储为07 00 00 00 08 00 00 00, (int)a+1后ptr2指向07后的00,取int得值00 00 00 08, 所以*ptr2为0x08000000,同理如果是大顶端的CPU,则结果为0800
w0911h 2009-06-03
  • 打赏
  • 举报
回复
上面有点错了,更正一下
[Quote=引用 1 楼 w0911h 的回复:]
C/C++ code
#include <stdio.h>
int main()
{
int a[5]={7,8,9,10,11};

int *ptr1=(int *)(&a+1);//ptr1指向a[5]

int *ptr2=(int *)((int )a+1); //ptr2指向a[1]

printf("%x,%x",ptr1[-1],*ptr2); //ptr1[-1]=a[4],*ptr2=a[1]
return 0;
}
[/Quote]
w0911h 2009-06-03
  • 打赏
  • 举报
回复

#include <stdio.h>
int main()
{
int a[5]={7,8,9,10,11};

int *ptr1=(int *)(&a+1);//ptr1指向a[6]

int *ptr2=(int *)((int )a+1); //ptr2指向a[1]

printf("%x,%x",ptr1[-1],*ptr2); //ptr1[-1]=a[5],*ptr2=a[1]
return 0;
}

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧