2
一般short
變量必須在2字節對齊地址,但如果我試圖將它指向一個奇數地址,是否有任何問題?在VS C++ 2008上對齊
我在VC++ 2008上試試這個代碼,它運行正常,所以你可以解釋爲什麼?
unsigned char ca[10];
unsigned short *s1 = 0;
memset(ca, 1, 10);
s1 = (unsigned short*)&ca[0];
printf("s1 = %d\n", *s1);
s1 = (unsigned short*)&ca[1];
printf("s1 = %d\n", *s1);
在代碼段的上方,ca[0]
或ca[1]
有一個肯定在奇數地址,所以它不爲2字節對齊,但s1
是完全分配給兩個ca[0]
和ca[1]
。
那麼這段代碼是否正確無誤,建議這樣做?我想有一個可移植的方法,它可以讀取字節數組中的任何兩個字節作爲短變量,以便在幾乎所有的平臺/編譯器中都能正常工作。
非常感謝。
http://stackoverflow.com/questions/1496848/does-unaligned-memory-access-always-cause-bus-errors可能會在這裏提供一些有用的背景信息... – reuben
你現在所擁有的肯定不是便攜式的也不安全。迂迴地說,它實際上是UB。它在你的情況下工作的原因是因爲x86允許未對齊的內存訪問。 – Mysticial
除此之外,還存在排序問題...... – Mysticial