# 你所不知道的 C 語言:記憶體管理、對齊及硬體特性
[Source](https://hackmd.io/@sysprog/c-memory)
## Data alignment

### Endianness

* 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)`

1. `uintptr_t csrc = (uintptr_t) src`

`v & 0x000000ff = 0xef`
2. `csrc++`

`v & 0x000000ff = 0xbe`
3. `csrc++`

`v & 0x000000ff = 0xad`
4. `csrc++`

`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
```