※ 引述《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)