short *p = NULL,指針 p 佔幾字節?double *p = NULL,指針只佔 4 字節,解引用取 8 字節會否越界?指針大小與指向類型無關,僅取決於架構位數:
32 位系統 → 指針 4 字節 (32 bit 地址總線)
64 位系統 → 指針 8 字節 (64 bit 地址總線)
| 聲明 | 指針大小 | 解引用讀取字節數 | 指針算術 +1 步長 |
|---|---|---|---|
short *p | 4/8 字節 | 2 字節 | 2 字節 |
double *p | 4/8 字節 | 8 字節 | 8 字節 |
struct Foo *p | 4/8 字節 | sizeof(Foo) | sizeof(Foo) |
0x1000)。*p 時,編譯器根據類型 **從該地址讀取對應字節數**(short 讀 2 字節,double 讀 8 字節)。p+1 時,編譯器根據類型 **增加對應字節數**(short +2,double +8)。double *p = malloc(sizeof(double)) 分配 8 字節,解引用安全;若只 malloc(4) 再按 double 讀寫,**才會越界**。
#include <stdio.h>
int main() {
printf("sizeof(short*) = %zu\n", sizeof(short*)); // 4 (32位) / 8 (64位)
printf("sizeof(double*) = %zu\n", sizeof(double*));
short s = 0x1234; short *ps = &s;
double d = 3.14; double *pd = &d;
printf("ps = %p, *ps = %hx\n", (void*)ps, *ps); // 讀2字節
printf("pd = %p, *pd = %f\n", (void*)pd, *pd); // 讀8字節
return 0;
}
指針 = **地址容器**(固定大小),類型 = **解讀規則**(決定讀幾字節、步長多少)。**指針大小不隨類型變化**,越界取決於分配內存是否滿足類型要求,而非指針本身。