最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

聊聊C語言中sizeof運算符的一個陷阱

 更新時間:2022年11月07日 11:05:46   作者:風靜如云  
在C語言中,sizeof()是一個判斷數(shù)據(jù)類型或者表達式長度的運算符,下面這篇文章主要給大家介紹了關于C語言中sizeof運算符的一個陷阱的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

sizeof運算符通常用于獲取變量或類型所占內(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;
}

運行程序輸出:

sizeof(a)=4
sizeof(int)=4
sizeof(d)=8
sizeof(struct D)=8

使用此特性可以結合memset,對數(shù)據(jù)結構進行初始化:

#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時需要注意,對于指針類型的變量,只會求值指針的大小,不會求值其指向內(nèi)容的大?。?/p>

#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

這對于通過函數(shù)參數(shù)進行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

可見,在函數(shù)f內(nèi),通過指針pStr求值sizeof,獲得的是指針的大小(64位系統(tǒng)上位8個字節(jié)),如果依據(jù)此指來初始化str,那么只能操作8個字節(jié),也就導致了調用函數(shù)f后,str進入了一種混亂的狀態(tài),其內(nèi)容為:aaaaaaaa9

Sizeof的作用非常簡單:求對象或者類型的大小。然而sizeof又非常復雜,它涉及到很多特殊情況,本篇把這些情況分門別類,總結出了sizeof的10個特性:

(0)sizeof是運算符,不是函數(shù);

(1)sizeof不能求得void類型的長度;

(2)sizeof能求得void類型的指針的長度;

(3)sizeof能求得靜態(tài)分配內(nèi)存的數(shù)組的長度!

(4)sizeof不能求得動態(tài)分配的內(nèi)存的大小!

(5)sizeof不能對不完整的數(shù)組求長度;

(6)當表達式作為sizeof的操作數(shù)時,它返回表達式的計算結果的類型大小,但是它不對表達式求值!

(7)sizeof可以對函數(shù)調用求大小,并且求得的大小等于返回類型的大小,但是不執(zhí)行函數(shù)體!

(8)sizeof求得的結構體(及其對象)的大小并不等于各個數(shù)據(jù)成員對象的大小之和!

(9)sizeof不能用于求結構體的位域成員的大小,但是可以求得包含位域成員的結構體的大??!

概述:

Sizeof是C/C++中的關鍵字,它是一個運算符,其作用是取得一個對象(數(shù)據(jù)類型或者數(shù)據(jù)對象)的長度(即占用內(nèi)存的大小,以byte為單位)。其中類型包含基本數(shù)據(jù)類型(不包括void)、用戶自定義類型(結構體、類)、函數(shù)類型。數(shù)據(jù)對象是指用前面提到的類型定義的普通變量和指針變量(包含void指針)。不同類型的數(shù)據(jù)的大小在不同的平臺下有所區(qū)別,但是c標準規(guī)定所有編譯平臺都應該保證sizeof(char)等于1。關于sizeof的更多概述你可以在msdn總輸入sizeof進行查詢。

總結

到此這篇關于C語言中sizeof運算符的一個陷阱的文章就介紹到這了,更多相關C語言sizeof運算符陷阱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

  • 函數(shù)指針的一些概念詳解

    函數(shù)指針的一些概念詳解

    首先看函數(shù)指針的語法,舉一個最簡單的例子,要創(chuàng)建一個函數(shù)指針,則它與它指向的函數(shù),在參數(shù)個數(shù)類型以及返回值上都保持一致,跟重載的要求應該是一樣的
    2013-09-09
  • 基于C語言代碼實現(xiàn)點餐系統(tǒng)

    基于C語言代碼實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言代碼實現(xiàn)點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • gcc中extra qualification錯誤的解決

    gcc中extra qualification錯誤的解決

    今天小編就為大家分享一篇gcc中extra qualification錯誤的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++設計模式之外觀模式(Facade)

    C++設計模式之外觀模式(Facade)

    這篇文章主要為大家詳細介紹了C++設計模式之外觀模式(Facade),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • C++通過msxml調用webservice示例分享

    C++通過msxml調用webservice示例分享

    這篇文章主要介紹了C++通過msxml調用webservice示例分享,需要的朋友可以參考下
    2014-03-03
  • C語言的getc()函數(shù)和gets()函數(shù)的使用對比

    C語言的getc()函數(shù)和gets()函數(shù)的使用對比

    這篇文章主要介紹了C語言的getc()函數(shù)和gets()函數(shù)的使用對比,從數(shù)據(jù)流中一個是讀取字符一個是讀取字符串,需要的朋友可以參考下
    2015-08-08
  • C語言代碼實現(xiàn)簡單2048游戲

    C語言代碼實現(xiàn)簡單2048游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)2048游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 淺談C語言的字符串分割

    淺談C語言的字符串分割

    下面小編就為大家?guī)硪黄獪\談C語言的字符串分割。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • C++?Boost?MultiArray簡化使用多維數(shù)組庫

    C++?Boost?MultiArray簡化使用多維數(shù)組庫

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++中獲取字符串長度的函數(shù)sizeof()、strlen()、length()、size()詳解和區(qū)別(推薦)

    C++中獲取字符串長度的函數(shù)sizeof()、strlen()、length()、size()詳解和區(qū)別(推薦)

    在C++中計算長度的函數(shù)有四種,它們分別是sizeof()?,size(),strlen(),str.length(),這篇文章主要介紹了C++中獲取字符串長度的函數(shù)sizeof()、strlen()、length()、size()詳解和區(qū)別,需要的朋友可以參考下
    2023-02-02

最新評論

东莞市| 洛扎县| 永泰县| 临沂市| 婺源县| 贵阳市| 和政县| 永胜县| 新源县| 新密市| 淮阳县| 宁蒗| 辽阳市| 内黄县| 平安县| 句容市| 来宾市| 文化| 鲁甸县| 西充县| 镇平县| 当雄县| 来凤县| 多伦县| 社会| 西安市| 勐海县| 荆门市| 晋中市| 庆阳市| 平武县| 苏尼特左旗| 苍溪县| 汉沽区| 桃源县| 文成县| 家居| 禹州市| 望江县| 来安县| 开平市|