C語言中,sizeof關鍵字(詳細介紹)

目錄

    • ?1. 基本用法?
      • (1) ?基本數據類型?
      • (2) ?變量?
      • (3) ?數組?
      • (4) ?指針?
    • ?2. 特殊用法?
      • (1) ?結構體與內存對齊?
      • (2) ?動態內存分配?
      • (3) ?表達式?
    • ?3. 注意事項?
      • ?1)sizeof 與 strlen 的區別?:
      • ?2)變長數組(VLA)?:
      • ?3)不要誤用?:
    • ?4. 常見問題示例?
      • (1) ?指針與數組的混淆?
      • (2) ?結構體內存對齊?

在C語言中,sizeof 是一個? 編譯時運算符?,用于計算變量、數據類型或表達式在 內存中所占的?字節數?。它不是一個函數, 不需要在運行時執行,且 結果是編譯時確定的常量(除非操作數是變長數組,VLA)。

?1. 基本用法?

(1) ?基本數據類型?

printf("int 大小: %zu\n", sizeof(int));       // 通常為4字節(32/64位系統)
printf("char 大小: %zu\n", sizeof(char));     // 固定為1字節
printf("double 大小: %zu\n", sizeof(double)); // 通常為8字節

(2) ?變量?

int a = 10;
double b;
printf("變量a的大小: %zu\n", sizeof(a));  // 等價于 sizeof(int)
printf("變量b的大小: %zu\n", sizeof b);   // 括號可省略(僅對變量)

(3) ?數組?

計算整個數組的總字節數:

int arr[10];
printf("數組總大小: %zu\n", sizeof(arr)); // 10 * sizeof(int)

計算數組元素個數:

int len = sizeof(arr) / sizeof(arr[0]); // 10

(4) ?指針?

指針的大小與指向的數據類型無關,僅取決于系統架構:

int *p;
char *str;
printf("指針p的大小: %zu\n", sizeof(p));    // 32位系統為4字節,64位系統為8字節
printf("指針str的大小: %zu\n", sizeof(str)); // 同上

?2. 特殊用法?

(1) ?結構體與內存對齊?

結構體的大小可能因內存對齊規則而大于成員大小的簡單相加:

struct Example {char c;    // 1字節(對齊到4字節)int i;     // 4字節double d;  // 8字節
};
printf("結構體大小: %zu\n", sizeof(struct Example)); 
// 輸出可能是 1 + 3(填充) +4 +8 = 16字節(對齊到8字節邊界)

(2) ?動態內存分配?

sizeof 無法直接獲取動態分配內存的大小:

int *p = malloc(10 * sizeof(int));
printf("p的大小: %zu\n", sizeof(p)); // 輸出指針的大小(如8字節),而非分配的內存大小!

(3) ?表達式?

計算表達式結果類型的字節數(表達式不會被執行):

int x = 0;
printf("表達式大小: %zu\n", sizeof(x + 3.14)); // 等價于 sizeof(double)

?3. 注意事項?

?1)sizeof 與 strlen 的區別?:

  • sizeof 計算內存大小(包括字符串的終止符 \0);
  • strlen 計算字符串長度(不包含 \0)。
char str[] = "hello";
printf("sizeof(str): %zu\n", sizeof(str)); // 輸出6(5字符 + \0)
printf("strlen(str): %zu\n", strlen(str)); // 輸出5

?2)變長數組(VLA)?:

C99支持變長數組,此時 sizeof 的結果在運行時計算:

int n = 10;
int vla[n];
printf("VLA大小: %zu\n", sizeof(vla)); // 輸出10 * sizeof(int)
?類型轉換?:
sizeof 的結果類型是 size_t(無符號整數),打印時使用 %zu:printf("size_t大小: %zu\n", sizeof(size_t)); // 通常為8(64位系統)

?3)不要誤用?:

  • sizeof(指針) 返回指針的大小,而非指向數據的大小!
  • sizeof 無法獲取動態數組或堆內存的實際大小。

?4. 常見問題示例?

(1) ?指針與數組的混淆?

void func(int arr[]) {// arr 退化為指針!printf("函數內數組大小: %zu\n", sizeof(arr)); // 輸出指針大小(如8字節)
}int main() {int arr[10];printf("main中數組大小: %zu\n", sizeof(arr)); // 輸出40(假設int為4字節)func(arr);
}

(2) ?結構體內存對齊?

struct A {char a;     // 1字節int b;      // 4字節(對齊到4字節邊界)short c;    // 2字節(對齊到2字節邊界)
};
// 總大小:1 + 3(填充) +4 +2 +2(填充) = 12字節(對齊到4字節)
printf("struct A大小: %zu\n", sizeof(struct A)); 

?總結?

?用法?示例??說明?
基本類型大小sizeof(int)返回類型的字節數
變量大小sizeof(a)等價于變量類型的 sizeof
數組總大小sizeof(arr)數組元素個數 × 單個元素大小
指針大小sizeof(int*)取決于系統架構(4或8字節)
結構體大小sizeof(struct Example)考慮內存對齊規則

合理使用 sizeof 可以避免硬編碼數據類型大小,增強代碼的可移植性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79294.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ADK 第三篇 Agents (LlmAgent)

Agents 在智能體開發套件(ADK)中,智能體(Agent)是一個獨立的執行單元,旨在自主行動以實現特定目標。智能體能夠執行任務、與用戶交互、使用外部工具,并與其他智能體協同工作。 在ADK中&#x…

【深度學習】典型的 CNN 網絡

目錄 一、LeNet-5 (1)LeNet-5 網絡概覽 (2)網絡結構詳解 (3)關鍵組件與數學原理 3.1 局部感受野與卷積運算 3.2 權重共享 3.3 子采樣(Pooling) 3.4 激活函數 (4…

4.8/Q1,中山大學用NHANES:膳食煙酸攝入量與非酒精性脂肪肝之間的關聯

文章題目:Association between Dietary Niacin Intake and Nonalcoholic Fatty Liver Disease: NHANES 2003-2018 DOI:10.3390/nu15194128 中文標題:膳食煙酸攝入量與非酒精性脂肪肝之間的關聯:NHANES 2003-2018 發表雜志&#xf…

高效管理遠程服務器Termius for Mac 保姆級教程

以下是 Termius for Mac 保姆級教程,涵蓋安裝配置、核心功能、實戰案例及常見問題解決方案,助你高效管理遠程服務器(如Vultr、AWS等)。 一、Termius 基礎介紹 1. Termius 是什么? 跨平臺SSH客戶端:支持Ma…

理解數學概念——支集(支持)(support)

1. 支集(support)的定義 在數學中,一個實函數 f 的支集(support)是函數的不被映射到 0 的元素域(即定義域)的子集。若 f 的(定義)域(domain)是一個拓撲空間(即符合拓撲的集合),則 f 的支集則定義為包含( f 的元素域中)不被映射到0的所有點之最小閉集…

Vue 3 Element Plus 瀏覽器使用例子

Element Plus 是一個基于 Vue 3 的流行開源 UI 庫,提供了一系列的組件,幫助開發者快速構建現代化的用戶界面。它的設計簡潔、現代,包含了許多可定制的組件,如按鈕、表格、表單、對話框等,適合用于開發各種 Web 應用。 …

SSR vs SSG:前端渲染模式終極對決(附 Next.js/Nuxt.js 實戰案例)

一、引言:前端渲染模式的進化之路 隨著互聯網的發展,用戶對于網頁的加載速度和交互體驗要求越來越高。前端渲染技術作為影響網頁性能的關鍵因素,也在不斷地發展和演進。從最初的客戶端渲染(CSR),到后來的服…

算法筆記.分解質因數

代碼實現&#xff1a; #include<iostream> using namespace std; void breakdown(int x) {int t x;for(int i 2;i < x/i;i){if(t%i 0){int counts 0;while(t % i 0){t/i;counts;}cout << i <<" "<< counts<<endl;}}if(t >…

CUDA Error: the provided PTX was compiled with an unsupported toolchain

CUDA程序編譯時生成的PTX代碼與系統上的CUDA驅動版本不兼容 CUDA 編譯器版本&#xff1a; CUDA 12.6 (nvcc 編譯器版本) CUDA 驅動版本&#xff1a; CUDA 12.3 (nvidia-smi 驅動版本) 解決方法&#xff1a; 驅動版本下載參考&#xff1a;Your connected workspace for wiki…

計算機組成原理實驗(7) 堆指令部件模塊實驗

實驗七 堆指令部件模塊實驗 一、實驗目的 1、掌握指令部件的組成方式。 2、熟悉指令寄存器的打入操作&#xff0c;PC計數器的設置和加1操作&#xff0c;理解跳轉指令的實現過程。 二、實驗要求 按照實驗步驟完成實驗項目&#xff0c;掌握數據打入指令寄存器IR1、PC計數器的…

2022 年 6 月大學英語四級考試真題(第 2 套)——閱讀版——仔細閱讀題

&#x1f3e0;個人主頁&#xff1a;fo安方的博客? &#x1f482;個人簡歷&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大學MBA在讀&#xff0c;也考取過HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等證書。&#x1f433; &…

磁盤文件系統

磁盤文件系統 一、磁盤結構1.1 認識一下基礎的硬件設備以及真實的機房環境1.2 磁盤物理結構與存儲結構1、磁盤物理結構2、磁盤的存儲結構3、CHS地址定位4、磁盤的邏輯結構&#xff08;LBA&#xff09;5 磁盤真實過程5 CHS && LBA地址 二、理解分區、格式化1 引?"…

基于LangChain 實現 Advanced RAG-后檢索優化(下)-上下文壓縮與過濾

摘要 Advanced RAG 的后檢索優化&#xff0c;是指在檢索環節完成后、最終響應生成前&#xff0c;通過一系列策略與技術對檢索結果進行深度處理&#xff0c;旨在顯著提升生成內容的相關性與質量。在這些優化手段中&#xff0c;上文壓縮與過濾技術是提升檢索結果質量的重要手段。…

為什么 Vite 速度比 Webpack 快?

一、webpack會先進行編譯&#xff0c;再運行&#xff0c;vite會直接啟動&#xff0c;再按需編譯文件。 首先看兩張圖&#xff0c;可以清晰的看到&#xff0c;上面的圖是webpack編譯過的&#xff0c;而下面的圖是vite直接使用工程內文件。 二、區別于Webpack先打包的方式&am…

C# 操作符

C# 操作符 一、操作符概覽二、優先級與運算順序三、各類操作符的實例 一、操作符概覽 操作符&#xff08;運算符&#xff09;的本質是函數的簡記法 操作符不能脫離與它關聯的數據類型 int x 5; int y 4; int z x / y; Console.WriteLine(z);//輸出1double a 5.0; double b…

C++設計模式:面向對象的八大設計原則之四

里氏替換原則&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09;是面向對象設計中的一個重要原則&#xff0c;它指出子類必須能夠替換它的基類&#xff0c;并且程序的行為不會發生改變。也就是說&#xff0c;在任何使用基類對象的地方&#xff0c;都可以透…

網絡通信領域的基礎或流行協議

一、TCP(傳輸控制協議) 1. 宏觀介紹 TCP:全稱“Transmission Control Protocol”——傳輸控制協議,是互聯網最基礎的傳輸協議之一。傳輸層協議,提供面向連接、可靠的字節流傳輸服務。它通過三次握手建立連接、四次揮手斷開連接,確保數據有序、完整地傳輸作用:讓兩個設備…

【教學類-34-10】20250503(通義萬相)4*3蝴蝶拼圖(圓形、三角、正方、半圓的凹凸小塊+參考圖灰色)

背景需求 2023年從網站上搜索拼圖代碼,陸續改良了圓形、三角形、菱形凹凸) 【教學類-34-05】20230425拼圖(“圓角”凹凸拼圖)3*4格子(中班主題《個別化拼圖》偏美術)_拼圖的槽叫什么形狀-CSDN博客文章瀏覽閱讀1.1k次。【教學類-34-05】20230425拼圖(“圓角”凹凸拼圖)…

bellard.org? : QuickJS 如何使用 qjs 執行 js 腳本

參閱上一篇&#xff1a;Fabrice Bellard&#xff08;個人網站&#xff1a;?bellard.org?&#xff09;介紹 Fabrice Bellard&#xff08;個人網站&#xff1a;?bellard.org?&#xff09;是計算機領域最具影響力的程序員之一&#xff0c;其貢獻跨越多個技術領域并持續推動開…

數據結構---

案例一 1.隨機生成n個工人工時&#xff0c;100以內&#xff0c;工號分別為2021101到2021100n 2.以工時數為關鍵字分別使用選擇排序、冒泡排序、插入排序進行升序排序。 3.把排序后的結果輸出&#xff0c;包括工號工時數 4.比較三種算法對相同的n值數組排序所花的時間 代碼如下&…