#include #include #include #include #include int main(void) ; char str2[16]=; char *p=null; strncpy(str1,"build with gcc 4.3 under ubuntu 64bit, 2011-7-23",48); strncpy(str2,"123456789abcdef",16); /* 16 bytes */ printf("%p %p %p\n",&i,str1,&str2); p=(str1>str2?str2:str1); for(i=0;istr2?str2:str1),sizeof(str1)+sizeof(str2)); printf("%d\n",size); #endif return 0; }
乙個很有意思的現象,對於上面這段程式碼,ubuntu 64bit和freebsd的結果是不同的。
root@ubuntu:~# ./wr
0x7fff9a648150 0x7fff9a648180
build with gcc 4.3 under ubuntu 64bit, 2011-7-23123456789abcdef
[root@freebsd ~]# ./rw
0x7fffffffec30 0x7fffffffec20
123456789abcdefbuild with gcc 4.3 under ubuntu 64bit, 2011-7-23
通常意義上,函式體內部宣告的變數都會在棧上分配,位址是向下增長的,那麼就是freebsd的結果。可是ubuntu的結果正好相反,分配位址看起來都是棧上分配的位址。
真是很奇怪的問題,難道是ubuntu對於陣列的處理採取了不同的方式?
好吧,繼續追蹤,刪掉不影響結果的程式碼,最後簡化成這個樣子:
#include int main(void) 嗯,夠簡潔哦,親!
root@ubuntu:~# cc wr2.c;./a.out
0x7fff9f7e32e0 0x7fff9f7e3310 up
[root@freebsd ~]# cc wr2.c;./a.out
0x7fffffffec50 0x7fffffffec40 down
看見了麼,親?就是這樣神奇!都是64位系統有沒有!結果就是不一樣,有沒有!
好吧,我再修改!
#include int main(void) 最終發現了這樣的現象,將str1定義為1個位元組,那麼位址向下增長;定義為2個位元組,位址向上增長。
又做了一些測試,得出如下結論:ubuntu下,系統會比較兩個陣列變數的空間大小,優先把小的陣列定義在前面。
root@ubuntu:~# gcc -v
using built-in specs.
target: x86_64-linux-gnu
configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.2 --program-suffix=-4.2 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
thread model: posix
gcc version 4.2.4 (ubuntu 4.2.4-1ubuntu4)
[root@freebsd ~]# gcc -v
using built-in specs.
target: amd64-undermydesk-freebsd
configured with: freebsd/amd64 system compiler
thread model: posix
gcc version 4.2.1 20070719 [freebsd]
棧的增長方向
如何判斷棧的增長方向?對於乙個用慣了i386系列機器的人來說,這似乎是乙個無聊的問題,因為棧就是從高位址向低位址增長。不過,顯然這不是這個問題的目的,既然把這個問題拿出來,問的就不只是i386系列的機器,跨硬體平台是這個問題的首先要考慮到的因素。在乙個物質極大豐富的年代,除非無路可退,否則我們堅決不...
判斷棧的增長方向
dreamhead老大曾經討論過這個問題,尋找一種可移植的方式來判斷棧的增長方向,見 棧的增長方向 今天在讀ruby hacking guide第5章,介紹alloca函式的部分,提到ruby實現的c語言版本的alloca.c,讀了下 發現這裡倒是實現了乙個很漂亮的函式用於 實現判斷棧的增長方向,利...
如何判斷棧的增長方向?
如何判斷棧的增長方向?對於乙個用慣了i386系列機器的人來說,這似乎是乙個無聊的問題,因為棧就是從高位址向低位址增長。不過,顯然這不是這個問題的目的,既然把這個問題拿出來,問的就不只是i386系列的機器,跨硬體平台是這個問題的首先要考慮到的因素。在乙個物質極大豐富的年代,除非無路可退,否則我們堅決不...