二维数组cast

学写动态二维数组,不同操作系统之间的处理差异很大,什么原因呢?。

代码:

一下是不同操作系统的执行情况:

1,Linux ubuntu 2.6.24-22-generic #1 SMP Mon Nov 24 19:35:06 UTC 2008 x86_64 GNU/Linux

gcc version 4.2.4 (Ubuntu 4.2.4-1ubuntu4)

a[0][0] 0x7fff76c74770
a[0][1] 0x7fff76c74774
a[0][2] 0x7fff76c74778
a[1][0] 0x7fff76c7477c
a[1][1] 0x7fff76c74780
a[1][2] 0x7fff76c74784
a[2][0] 0x7fff76c74788
a[2][1] 0x7fff76c7478c
a[2][2] 0x7fff76c74790
a:      0x7fff76c74770
a+1:    0x7fff76c74778
a+2:    0x7fff76c74780
a+5:    0x7fff76c74798
*(a+1):    3
*(a+2):    5
*(a+5):    1852916164

2,AIX aix 3 5 00C97AC04C00 powerpc unknown AIX

gcc version 4.2.0

a[0][0] 2ff22bc8
a[0][1] 2ff22bcc
a[0][2] 2ff22bd0
a[1][0] 2ff22bd4
a[1][1] 2ff22bd8
a[1][2] 2ff22bdc
a[2][0] 2ff22be0
a[2][1] 2ff22be4
a[2][2] 2ff22be8
a:      2ff22bc8
a+1:    2ff22bcc
a+2:    2ff22bd0
a+5:    2ff22bdc
*(a+1):    2
*(a+2):    3
*(a+5):    6

3,FreeBSD freebsd.unix-center.net 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12

08:43:30 UTC 2007

gcc version 3.4.6 [FreeBSD] 20060305

a[0][0] 0x7fffffffebc0
a[0][1] 0x7fffffffebc4
a[0][2] 0x7fffffffebc8
a[1][0] 0x7fffffffebcc
a[1][1] 0x7fffffffebd0
a[1][2] 0x7fffffffebd4
a[2][0] 0x7fffffffebd8
a[2][1] 0x7fffffffebdc
a[2][2] 0x7fffffffebe0
a:      0x7fffffffebc0
a+1:    0x7fffffffebc8
a+2:    0x7fffffffebd0
a+5:    0x7fffffffebe8
*(a+1):    3
*(a+2):    5
*(a+5):    4195742

4,Linux fedora.unix-center.net 2.6.27.10-grsec2.1.12 #2 SMP Fri May 8 07:04:03 CST 2009 i686 i686 i386 GNU/Linux

gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC)

a[0][0] 0x59863d2c
a[0][1] 0x59863d30
a[0][2] 0x59863d34
a[1][0] 0x59863d38
a[1][1] 0x59863d3c
a[1][2] 0x59863d40
a[2][0] 0x59863d44
a[2][1] 0x59863d48
a[2][2] 0x59863d4c
a:      0x59863d2c
a+1:    0x59863d30
a+2:    0x59863d34
a+5:    0x59863d40
*(a+1):    2
*(a+2):    3
*(a+5):    6

5,SunOS t1000 5.10 Generic_118833-33 sun4v sparc SUNW,Sun-Fire-T1000 Solaris

gcc version 4.0.3 (gccfss)

a[0][0] ffbffcd8
a[0][1] ffbffcdc
a[0][2] ffbffce0
a[1][0] ffbffce4
a[1][1] ffbffce8
a[1][2] ffbffcec
a[2][0] ffbffcf0
a[2][1] ffbffcf4
a[2][2] ffbffcf8
a:      ffbffcd8
a+1:    ffbffcdc
a+2:    ffbffce0
a+5:    ffbffcec
*(a+1):    2
*(a+2):    3
*(a+5):    6

6,window xp home

gcc version 3.4.2 (mingw-special)

a[0][0] 0013FF74
a[0][1] 0013FF78
a[0][2] 0013FF7C
a[1][0] 0013FF80
a[1][1] 0013FF84
a[1][2] 0013FF88
a[2][0] 0013FF8C
a[2][1] 0013FF90
a[2][2] 0013FF94
a:      0013FF74
a+1:    0013FF78
a+2:    0013FF7C
a+5:    0013FF88
*(a+1):    2
*(a+2):    3
*(a+5):    6

结论:

发现有两大类

1,ubuntu和FreeBSD,a和a+1的递进式加2(就是列数)的。

2,aix,Fedora,Solaris和xp是递进1的。

第一感觉是不是和OS有关系,可是linux和unix有相同的,xp和linux和unix也有相同的。

第二感觉是不是和编译器有关系,可是4.2.4和3.4.6是第一种情况,3.4.2和4.0.3是第二种情况。

那到底是和什么有关系呢?

机器硬件配置:unix-center.net

发现问题是这个样子的,是因为在被访问函数void g(int** a)中,a是指向int*类型的指针,所以a+1的值为a的值+sizeof(int*)。

以上系统中只有unbuntu和freebsd是64为系统(使用file命令可以发现,这两个系统的指针是64bytes的),而其他的是

32位系统,所以才会出现上面的结果。

 

总结起来还是对指针的理解有误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值