首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言指針內存佔用解析:指針大小固定,類型決定步長與解引用行為

     編輯:程式設計疑難解答

問題

  1. short *p = NULL,指針 p 佔幾字節?
  2. double *p = NULL,指針只佔 4 字節,解引用取 8 字節會否越界?

核心答案

指針大小與指向類型無關,僅取決於架構位數:
32 位系統 → 指針 4 字節 (32 bit 地址總線)
64 位系統 → 指針 8 字節 (64 bit 地址總線)

詳細解析

聲明指針大小解引用讀取字節數指針算術 +1 步長
short *p4/8 字節2 字節2 字節
double *p4/8 字節8 字節8 字節
struct Foo *p4/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;
}

總結

指針 = **地址容器**(固定大小),類型 = **解讀規則**(決定讀幾字節、步長多少)。**指針大小不隨類型變化**,越界取決於分配內存是否滿足類型要求,而非指針本身。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved