日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C memset 踩坑

發(fā)布時(shí)間:2023/12/2 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C memset 踩坑 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

memset 作為對(duì)內(nèi)存初始化的函數(shù),還是有不少坑和誤區(qū)的,今天就來(lái)對(duì)這個(gè)函數(shù)作一個(gè)總結(jié)。

二、函數(shù)作用

  • 最簡(jiǎn)單的調(diào)用就是將一個(gè)數(shù)組清零,代碼如下:

const?int?maxn?=?1024; int?a[maxn]; memset(a,?0,?sizeof(a));??//?a[0]=a[1]=a[...]=0;
  • 這里 sizeof(a) = maxn * 4 = 4096;

  • 表示的是將?數(shù)組首地址 a 開(kāi)始往后的 4096 個(gè)字節(jié),都設(shè)置為 0

三、效率對(duì)比

  • 直接調(diào)用 memset 接口清零 和 調(diào)用循環(huán)進(jìn)行清零,進(jìn)行一個(gè)測(cè)試后如下:

對(duì)長(zhǎng)度為 10000000 的數(shù)組,執(zhí)行100次調(diào)用;

模式memsetfor

debug

375ms

2156ms

release

343ms

329ms

  • 因?yàn)?release 版本會(huì)做各種優(yōu)化,編譯器發(fā)現(xiàn)重復(fù)執(zhí)行無(wú)效邏輯就會(huì)跳過(guò),所以不太好造數(shù)據(jù)測(cè)試,研究時(shí)間效率的時(shí)候還是參考 debug 版本(當(dāng)然,軟件發(fā)布的時(shí)候肯定用的是 release 版本)。

  • memset 無(wú)論從時(shí)間效率,還是代碼整潔來(lái)看都是由于 for 循環(huán)的,當(dāng)然也帶來(lái)了一些容易引起誤解的地方。

四、誤區(qū)總結(jié)

1、按字節(jié)設(shè)置

  • memset 實(shí)現(xiàn)原理是根據(jù)字節(jié)來(lái)設(shè)置的,比如對(duì)于字節(jié)數(shù)組char a[100],將所有字節(jié)都設(shè)置為5,就可以調(diào)用:

?memset(a,?5,?sizeof(a));
  • 但是,對(duì)于int b[100],也采用這種方法,就會(huì)導(dǎo)致錯(cuò)誤:

?memset(b,?5,?sizeof(b));
  • 得到 b 數(shù)組中元素的值為 84215045;

  • 為什么呢?

  • 我們把這個(gè)數(shù)組轉(zhuǎn)換成二進(jìn)制,得到:
    ( 00000101 00000101 00000101 00000101 ) 2 (00000101 \ 0000 0101 \ 0000 0101 \ 0000 0101)_2 (00000101 ?00000101 ?00000101 ?00000101)2

  • 因?yàn)?i n t int int 占據(jù)了 4 4 4 個(gè)字節(jié),把每個(gè)字節(jié)都設(shè)置成了5,所以最后轉(zhuǎn)成十進(jìn)制就變成了 84215045;

  • 同理,當(dāng)類(lèi)型是 short(二字節(jié)整數(shù)),或者 long long(八字節(jié)整數(shù))都會(huì)有類(lèi)似問(wèn)題,總結(jié)表格如下:

memset值charshortintlong long

0

0

0

0

0

-1

-1

-1

-1

-1

5

5

1285

84215045

361700864190383365

  • 表格中,只有0 和 -1是正常的,因?yàn)?0 的二進(jìn)制表示中,所有位都為0;-1 的二進(jìn)制表示中,所有位都為 1;

  • 特別的,當(dāng)需要設(shè)置的數(shù),對(duì)應(yīng)類(lèi)型的每個(gè)字節(jié)都是同一個(gè)數(shù)的時(shí)候,也可以采用 memset,比如:int 類(lèi)型的 252645135(十六進(jìn)制表示為:0x0f0f0f0f);

2、設(shè)置的值只有最低字節(jié)有效

memset(a,?0x05ffffff,?sizeof(a)); memset(a,?0xffffff05,?sizeof(a)); memset(a,?0xffffff08,?sizeof(a)); memset(a,?0x12345678,?sizeof(a));
  • 設(shè)置值的時(shí)候,只會(huì)采用最低的字節(jié)作為賦值用,通俗的講,就是以上四句話調(diào)用,等價(jià)于:

memset(a,?0xff,?sizeof(a)); memset(a,?0x05,?sizeof(a)); memset(a,?0x08,?sizeof(a)); memset(a,?0x78,?sizeof(a));

3、堆內(nèi)存不可直接 sizeof 取首地址

  • 在堆上申請(qǐng)了一個(gè)數(shù)組空間,并且想要給它初始化,調(diào)用如下:

const?int?maxn?=?1024; int?*p?=?new?[maxn]; memset(p,?0,?sizeof(p));
  • 這里進(jìn)入了另一個(gè)誤區(qū),因?yàn)?p p p 在這里雖然是數(shù)組首地址,但是它扮演的角色更多的,其實(shí)是個(gè)指針,所以在進(jìn)行 sizeof 運(yùn)算符操作的時(shí)候,取得的值并不是 4096,而是指針的大小;

  • 32位機(jī)子上,指針大小為4,;64位機(jī)子上,指針大小為 8;

  • 正確做法是:

const?int?maxn?=?1024; int?*p?=?new?[maxn]; memset(p,?0,?maxn?*?sizeof(int));

4、傳參數(shù)組不可直接 sizeof 取首地址

  • 對(duì)傳參為數(shù)組的數(shù)據(jù)進(jìn)行 memset,調(diào)用如下:

void?fun(int?a[maxn])?{memset(a,?0,?sizeof(a)); }
  • 這里調(diào)用同樣是錯(cuò)誤的,因?yàn)楫?dāng)數(shù)組作為傳參的時(shí)候,這里的 a 已經(jīng)退化為指針,所以同樣不能用 sizeof 數(shù)組首地址來(lái)取大小;

  • 正確做法是:

void?fun(int?a[maxn])?{memset(a,?0,?maxn?*?sizeof(int)); }
  • 當(dāng)然,當(dāng)傳參是結(jié)構(gòu)體指針的時(shí)候也是如此;

- EOF -

來(lái)源:

https://blog.csdn.net/WhereIsHeroFrom/article/details/111660632

總結(jié)

以上是生活随笔為你收集整理的C memset 踩坑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美亚洲在线 | 自拍偷拍亚洲一区 | 日本中文字幕网 | 狠狠做深爱婷婷综合一区 | 精品国产乱码久久久久久图片 | 日韩成人免费在线视频 | 精品中文字幕在线观看 | 午夜性生活视频 | 久久成年 | 成人在线免费 | 超碰在线中文 | 亚洲精品天堂在线 | 91麻豆精品视频 | 五月天三级| 男人天堂av网站 | 精品人妻一区二区免费视频 | 亚洲综合网在线观看 | 国产精品视频导航 | 国产精品入口a级 | 奇米综合网 | 欧美激情18p | 日韩有码一区 | 亚欧美色图 | 熟妇人妻中文字幕无码老熟妇 | 玖玖精品视频 | 秘密基地动漫在线观看免费 | 欧美精品免费一区二区三区 | 人妻少妇无码精品视频区 | 日本视频免费在线 | 激情福利在线 | 中文字幕+乱码+中文字幕一区 | 欧美精品网址 | 久久成人视屏 | 美女扒开内裤让男人桶 | 日韩中文字幕在线观看视频 | 538国产精品视频一区二区 | 日日爱886| 操人网 | 无码人妻一区二区三区在线 | 香蕉视频久久久 | 黄瓜视频污在线观看 | 黄网站色| 成人精品久久 | 在线视频观看 | 亚洲国产一区二区在线观看 | 欧洲毛片| 三级无遮挡 | 四虎影视在线播放 | 久久久一区二区 | 国产乱淫av片杨贵妃 | 在线观看国产日韩 | 一区二区久久久 | 蜜桃av噜噜一区二区三区麻豆 | 美女视频毛片 | 黄色激情视频网站 | 国产一级啪啪 | 国产69精品久久久久777 | 天堂va蜜桃一区 | 国产美女免费无遮挡 | 日韩精品高清在线观看 | 男女猛烈无遮挡免费视频 | 丰满雪白极品少妇流白浆 | 姐姐的朋友2在线 | 日韩视频在线免费播放 | 色鬼综合 | 下面一进一出好爽视频 | 国产网红女主播精品视频 | 曰韩av| 日韩无套无码精品 | 亚洲女人在线 | 欧美日韩二区三区 | 日韩亚洲在线 | 6080一级片| 糖心vlog精品一区二区 | 亚洲毛片在线看 | 樱空桃在线观看 | 2017狠狠干 | 天天综合视频 | 亚洲天堂三区 | 亚洲熟女综合色一区二区三区 | 国产免费毛卡片 | 国产专区在线视频 | 超碰男人的天堂 | 久久久噜噜噜久久中文字幕色伊伊 | 午夜精品小视频 | 牛牛影视一区二区三区 | 国产美女无遮挡永久免费 | 久久久久久久久久久久久女国产乱 | 国产女同在线观看 | 国产成人三级在线观看视频 | 蜜臀av午夜精品 | 久久免费一级片 | 99riav国产精品 | 欧美日韩国产亚洲一区 | 美女三级网站 | 五十路在线 | 泰国午夜理伦三级 | 黄色视屏免费 | 97公开免费视频 |