網站首頁 編程語言 正文
sizeof運算符通常用于獲取變量或類型所占內存的大小(單位是字節)
#include <stdio.h>
struct D{
char a;
int b;
};
int main()
{
int a = 0;
struct D d;
printf("sizeof(a)=%ld\n", sizeof(a));
printf("sizeof(int)=%ld\n", sizeof(int));
printf("sizeof(d)=%ld\n", sizeof(d));
printf("sizeof(struct D)=%ld\n", sizeof(struct D));
return 0;
}
運行程序輸出:
sizeof(a)=4
sizeof(int)=4
sizeof(d)=8
sizeof(struct D)=8
使用此特性可以結合memset,對數據結構進行初始化:
#include <stdio.h>
#include <string.h>
struct D{
char a;
int b;
};
int main()
{
D d;
printf("before init:a=%d, b=%d\n", d.a, d.b);
memset(&d, 0, sizeof(d));
printf("after init:a=%d, b=%d\n", d.a, d.b);
return 0;
}
運行程序輸出:
before init:a=16, b=0
after init:a=0, b=0
不過在使用sizeof時需要注意,對于指針類型的變量,只會求值指針的大小,不會求值其指向內容的大小:
#include <stdio.h>
int main()
{
char str[10] = {0};
char* pStr = str;
printf("sizeof(str)=%ld\n", sizeof(str));
printf("sizeof(pStr)=%ld\n", sizeof(pStr));
return 0;
}
運行程序輸出:
sizeof(str)=10
sizeof(pStr)=8
這對于通過函數參數進行sizeof求值是一個陷阱:
#include <stdio.h>
#include <string.h>
void f(char *pStr)
{
memset(pStr, 'a', sizeof(pStr));
printf("pStr:%s sizeof(pStr)=%ld\n", pStr, sizeof(pStr));
}
int main()
{
char str[10] = "123456789";
printf("str:%s sizeof(str)=%ld\n", str, sizeof(str));
f(str);
return 0;
}
運行程序輸出:
str:123456789 sizeof(str)=10
pStr:aaaaaaaa9 sizeof(pStr)=8可見,在函數f內,通過指針pStr求值sizeof,獲得的是指針的大小(64位系統上位8個字節),如果依據此指來初始化str,那么只能操作8個字節,也就導致了調用函數f后,str進入了一種混亂的狀態,其內容為:aaaaaaaa9
Sizeof的作用非常簡單:求對象或者類型的大小。然而sizeof又非常復雜,它涉及到很多特殊情況,本篇把這些情況分門別類,總結出了sizeof的10個特性:
(0)sizeof是運算符,不是函數;
(1)sizeof不能求得void類型的長度;
(2)sizeof能求得void類型的指針的長度;
(3)sizeof能求得靜態分配內存的數組的長度!
(4)sizeof不能求得動態分配的內存的大小!
(5)sizeof不能對不完整的數組求長度;
(6)當表達式作為sizeof的操作數時,它返回表達式的計算結果的類型大小,但是它不對表達式求值!
(7)sizeof可以對函數調用求大小,并且求得的大小等于返回類型的大小,但是不執行函數體!
(8)sizeof求得的結構體(及其對象)的大小并不等于各個數據成員對象的大小之和!
(9)sizeof不能用于求結構體的位域成員的大小,但是可以求得包含位域成員的結構體的大小!
概述:
Sizeof是C/C++中的關鍵字,它是一個運算符,其作用是取得一個對象(數據類型或者數據對象)的長度(即占用內存的大小,以byte為單位)。其中類型包含基本數據類型(不包括void)、用戶自定義類型(結構體、類)、函數類型。數據對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型的數據的大小在不同的平臺下有所區別,但是c標準規定所有編譯平臺都應該保證sizeof(char)等于1。關于sizeof的更多概述你可以在msdn總輸入sizeof進行查詢。
總結
原文鏈接:https://blog.csdn.net/jiemashizhen/article/details/127598012
相關推薦
- 2022-03-27 Android實現房貸計算器功能_Android
- 2022-06-25 JQuery操作與遍歷元素并設置其屬性、樣式和內容_jquery
- 2021-12-31 linux下RPM包安裝基于xinetd的服務的管理_Linux
- 2022-11-15 Python中class內置方法__init__與__new__作用與區別解析_python
- 2022-09-27 淺談Redis緩存更新策略_Redis
- 2022-08-12 k8s?series初級calico使用介紹_云其它
- 2022-12-06 Python如何查看并打印matplotlib中所有的colormap(cmap)類型_python
- 2022-07-02 C語言細致講解線程同步的集中方式_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支