<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
sizeof運運算元通常用於獲取變數或型別所佔記憶體的大小(單位是位元組)
#include <stdio.h> struct D{ char a; int b; }; int main() { int a = 0; struct D d; printf("sizeof(a)=%ldn", sizeof(a)); printf("sizeof(int)=%ldn", sizeof(int)); printf("sizeof(d)=%ldn", sizeof(d)); printf("sizeof(struct D)=%ldn", 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=%dn", d.a, d.b); memset(&d, 0, sizeof(d)); printf("after init:a=%d, b=%dn", 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)=%ldn", sizeof(str)); printf("sizeof(pStr)=%ldn", 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)=%ldn", pStr, sizeof(pStr)); } int main() { char str[10] = "123456789"; printf("str:%s sizeof(str)=%ldn", 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進行查詢。
總結
到此這篇關於C語言中sizeof運運算元的一個陷阱的文章就介紹到這了,更多相關C語言sizeof運運算元陷阱內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45