看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《samuelcdf (溫泉龜)》之銘言: : 先說一下, 這是用指標的寫法, 至於p[0], p[1]哪一個該assign : 到x中, 得看endian決定 : 雖然按照學到的知識, 了解這樣做是可以的. 可是在這種情況下, : 用感覺來說, 會有種說不上來奇怪的感覺, 不知道有沒有人跟我 : 一樣 XDD : int main(int argc, char *argv[]) : { : int TestNumber; : int* pInteger = &TestNumber; : unsigned int* p = (unsigned int*)&pInteger; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^自殺行為 : printf("Sizeof int*: %d\n", sizeof(int*)); : printf("Sizeof int: %d\n", sizeof(int)); ^^^^ 這邊應該用 %zu 節錄自 FreeBSD 的 man page: Modifier d, i o, u, x, X n hh signed char unsigned char signed char * h short unsigned short short * l (ell) long unsigned long long * ll (ell ell) long long unsigned long long long long * j intmax_t uintmax_t intmax_t * t ptrdiff_t (see note) ptrdiff_t * z (see note) size_t (see note) q (deprecated) quad_t u_quad_t quad_t * : printf("\n%p\n", pInteger); : printf("\n[%08X]\n", p[0]); : printf("\n[%08X]\n", p[1]); : system("PAUSE"); : return 0; : } > gcc -v Using built-in specs. Target: x86_64-portbld-freebsd8.1 Thread model: posix gcc version 4.4.5 20100720 (prerelease) (GCC) > gcc -O3 -Wall test.c -o test test.c:11: warning: dereferencing pointer 'p' does break strict-aliasing rules test.c:5: note: initialized from here test.c:12: warning: dereferencing pointer '({anonymous})' does break strict-aliasing rules test.c:12: note: initialized from here > ./test Sizeof int*: 8 Sizeof int: 4 0x7fffffffe86c [FFFFE8A0] [00007FFF] 如果想要拿 pointer 拆這種東西, 最保險的方法是轉成 char * 去慢慢爬。 因為往 char * 的 casting 有特殊規則在, aliasing 的關係不會因為 pointer type 不同而自動消滅。 union 的解法雖然標準沒有保證, 不過大部分的 compiler 都支援那種技巧。 所以你大部分看到的可能還是拿 union 去拆。 -- Ling-hua Tseng (uranus@tinlans.org) Department of Computer Science, National Tsing-Hua University Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design Researching: Software pipelining for VLIW architectures Homepage: http://www.tinlans.org -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.110.176 ※ 編輯: tinlans 來自: 118.160.110.176 (08/31 14:16)