# 你所不知道的 C 語言:記憶體管理、對齊及硬體特性 [Source](https://hackmd.io/@sysprog/c-memory) ## Data alignment ![](https://i.imgur.com/4G6jow6.png) ### Endianness ![](https://i.imgur.com/FJJyWaI.png) * Big Endian 把**最高位元**放在word的起始位址 * Little Endian 把**最低位元**放到word的起始位址 ### Get unaligned 考慮以下 `unaligned_get32` 函式的實作: 1. 硬體架構為 32-bits 2. 位元組順序 Little endian ```c #include <stdint.h> #include <stddef.h> uint8_t unaligned_get8(void *src) { uintptr_t csrc = (uintptr_t) src; uint32_t v = *(uint32_t *) (csrc & 0xfffffffc); v = (v >> (((uint32_t) csrc & 0x3) * 8)) & 0x000000ff; return v; } uint32_t unaligned_get32(void *src) { uint32_t d = 0; uintptr_t csrc = (uintptr_t) src; for (int n = 0; n < 4; n++) { uint32_t v = unaligned_get8((void *) csrc); v = v << (n * 8); d = d | v; csrc++; } return d; } ``` * `uint32_t unaligned_get32(void *src)` ![](https://i.imgur.com/POPb1hv.png) 1. `uintptr_t csrc = (uintptr_t) src` ![](https://i.imgur.com/VrOkp4T.png) `v & 0x000000ff = 0xef` 2. `csrc++` ![](https://i.imgur.com/Tivt4Fx.png) `v & 0x000000ff = 0xbe` 3. `csrc++` ![](https://i.imgur.com/ne1QBIZ.png) `v & 0x000000ff = 0xad` 4. `csrc++` ![](https://i.imgur.com/oOExbPf.png) `v & 0x000000ff = 0xde` * `d = 0xdeadbeef` ```c #include <stdio.h> #include <stdint.h> int main(void) { uint32_t a = 0xdeadbeef; printf("a = %x\n", a); printf("&a = %p\n", &a); a = a >> 8; uint8_t *b = &a; printf("\nb = %p\n", b); printf("*(b) = %x\n", *(b)); printf("*(b+1) = %x\n", *(b+1)); printf("*(b+2) = %x\n", *(b+2)); return 0; } ``` ```shell $ ./main a = deadbeef &a = 0x7ffec2dc29d4 b = 0x7ffec2dc29d4 *(b) = be *(b+1) = ad *(b+2) = de ```