網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
sizeof運(yùn)算符通常用于獲取變量或類型所占內(nèi)存的大小(單位是字節(jié))
#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;
}
運(yùn)行程序輸出:
sizeof(a)=4
sizeof(int)=4
sizeof(d)=8
sizeof(struct D)=8
使用此特性可以結(jié)合memset,對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行初始化:
#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;
}
運(yùn)行程序輸出:
before init:a=16, b=0
after init:a=0, b=0
不過(guò)在使用sizeof時(shí)需要注意,對(duì)于指針類型的變量,只會(huì)求值指針的大小,不會(huì)求值其指向內(nèi)容的大小:
#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;
}
運(yùn)行程序輸出:
sizeof(str)=10
sizeof(pStr)=8
這對(duì)于通過(guò)函數(shù)參數(shù)進(jìn)行sizeof求值是一個(gè)陷阱:
#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;
}
運(yùn)行程序輸出:
str:123456789 sizeof(str)=10
pStr:aaaaaaaa9 sizeof(pStr)=8可見(jiàn),在函數(shù)f內(nèi),通過(guò)指針pStr求值sizeof,獲得的是指針的大小(64位系統(tǒng)上位8個(gè)字節(jié)),如果依據(jù)此指來(lái)初始化str,那么只能操作8個(gè)字節(jié),也就導(dǎo)致了調(diào)用函數(shù)f后,str進(jìn)入了一種混亂的狀態(tài),其內(nèi)容為:aaaaaaaa9
Sizeof的作用非常簡(jiǎn)單:求對(duì)象或者類型的大小。然而sizeof又非常復(fù)雜,它涉及到很多特殊情況,本篇把這些情況分門別類,總結(jié)出了sizeof的10個(gè)特性:
(0)sizeof是運(yùn)算符,不是函數(shù);
(1)sizeof不能求得void類型的長(zhǎng)度;
(2)sizeof能求得void類型的指針的長(zhǎng)度;
(3)sizeof能求得靜態(tài)分配內(nèi)存的數(shù)組的長(zhǎng)度!
(4)sizeof不能求得動(dòng)態(tài)分配的內(nèi)存的大小!
(5)sizeof不能對(duì)不完整的數(shù)組求長(zhǎng)度;
(6)當(dāng)表達(dá)式作為sizeof的操作數(shù)時(shí),它返回表達(dá)式的計(jì)算結(jié)果的類型大小,但是它不對(duì)表達(dá)式求值!
(7)sizeof可以對(duì)函數(shù)調(diào)用求大小,并且求得的大小等于返回類型的大小,但是不執(zhí)行函數(shù)體!
(8)sizeof求得的結(jié)構(gòu)體(及其對(duì)象)的大小并不等于各個(gè)數(shù)據(jù)成員對(duì)象的大小之和!
(9)sizeof不能用于求結(jié)構(gòu)體的位域成員的大小,但是可以求得包含位域成員的結(jié)構(gòu)體的大小!
概述:
Sizeof是C/C++中的關(guān)鍵字,它是一個(gè)運(yùn)算符,其作用是取得一個(gè)對(duì)象(數(shù)據(jù)類型或者數(shù)據(jù)對(duì)象)的長(zhǎng)度(即占用內(nèi)存的大小,以byte為單位)。其中類型包含基本數(shù)據(jù)類型(不包括void)、用戶自定義類型(結(jié)構(gòu)體、類)、函數(shù)類型。數(shù)據(jù)對(duì)象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型的數(shù)據(jù)的大小在不同的平臺(tái)下有所區(qū)別,但是c標(biāo)準(zhǔn)規(guī)定所有編譯平臺(tái)都應(yīng)該保證sizeof(char)等于1。關(guān)于sizeof的更多概述你可以在msdn總輸入sizeof進(jìn)行查詢。
總結(jié)
原文鏈接:https://blog.csdn.net/jiemashizhen/article/details/127598012
相關(guān)推薦
- 2023-04-13 微信分享,wx.config參數(shù)設(shè)置
- 2022-08-18 nginx之queue的具體使用_nginx
- 2022-10-04 python?numpy庫(kù)中數(shù)組遍歷的方法_python
- 2022-03-27 深入理解React?State?原理_React
- 2022-08-06 Golang使用Consul詳解_Golang
- 2023-03-28 Go字符串操作深入解析_Golang
- 2022-07-26 對(duì)Python中GIL(全局解釋器鎖)的一點(diǎn)理解淺析_python
- 2022-03-24 Sublime?Text3安裝Go語(yǔ)言相關(guān)插件gosublime時(shí)搜不到gosublime的解決方法
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支