【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】
選擇使用【strcpy_s、memcpy_s】還是選擇【strcpy,memcpy】? memset()的用法
memcpy_s,strcpy_s函數(shù)明確的指定了目標(biāo)內(nèi)存的大小,能夠清晰的暴露出內(nèi)存溢出的問(wèn)題,而普通的memcpy、strcpy則不會(huì)。
為了保證內(nèi)存拷貝有足夠的空間,防止筆誤,【盡量使用memcpy_s代替memcpy】。
(1)memcpy_s()的用法:
memcpy_s 復(fù)制src 的 count 字節(jié)到 dest;如果dest或 src是null指針,或者 numberOfElements 為緩沖區(qū)太小,會(huì)拋出異常。
void Raw2Mat(CameraPublishDecodedStruct src_yuv_img,cv::Mat &frame) {std::shared_ptr<hiai::ImageData<u_int8_t>> input_image =std::make_shared<hiai::ImageData<u_int8_t>>();input_image->size = src_yuv_img.raw_data.size();// input_image->data = std::shared_ptr<u_int8_t>(new // u_int8_t[src_yuv_img.raw_data.size()]); // memcpy_s(input_image->data.get(), src_yuv_img.raw_data.size(),// src_yuv_img.raw_data.data(), src_yuv_img.raw_data.size());//上面注釋的兩句話(huà)可以用下面這句代替input_image->data = std::shared_ptr<u_int8_t>(const_cast<u_int8_t *>(src_yuv_img.raw_data.data()), [](u_int8_t *p) {});input_image->height = src_yuv_img.height;input_image->width = src_yuv_img.width;cv::Mat rgb_img(input_image->height, input_image->width, CV_8UC3);cv::Mat yuyv_img =cv::Mat(input_image->height * 3 / 2, input_image->width, CV_8UC1,static_cast<void *>(input_image->data.get()));cv::cvtColor(yuyv_img, rgb_img, cv::COLOR_YUV420sp2RGB);frame = rgb_img; }(2) memset()函數(shù)的用法
memset函數(shù)詳細(xì)說(shuō)明
1)void *memset(void *s,int c,size_t n)
總的作用:將已開(kāi)辟內(nèi)存空間 s 的首 n 個(gè)字節(jié)的值設(shè)為值 c。
2) memset()函數(shù)常用于內(nèi)存空間初始化。如:
3)memset可以方便的清空一個(gè)結(jié)構(gòu)類(lèi)型的變量或數(shù)組。 如:
struct sample_struct{char csName[16];int iSeq;int iType; };對(duì)于變量: struct sample_strcut stTest;一般情況下,清空stTest的方法: stTest.csName[0]='/0'; stTest.iSeq=0; stTest.iType=0;用memset就非常方便: memset(&stTest,0,sizeof(struct sample_struct));如果是數(shù)組: struct sample_struct TEST[10]; 則 memset(TEST,0,sizeof(struct sample_struct)*10);#include <mem.h> void* memset(void* s, int c, size_t n){unsigned char* p = (unsigned char*) s;while (n > 0) {*p++ = (unsigned char) c;--n;}return s; }memset()的函數(shù), 它可以一字節(jié)一字節(jié)地把整個(gè)數(shù)組設(shè)置為一個(gè)指定的值。memset()函數(shù)在mem.h頭文件中聲明,它把數(shù)組的起始地址作為其第一個(gè)參數(shù),第二個(gè)參數(shù)是設(shè)置數(shù)組每個(gè)字節(jié)的值,第三個(gè)參數(shù)是數(shù)組的長(zhǎng)度(字節(jié)數(shù),不是元素個(gè)數(shù))。其函數(shù)原型為:
void *memset(void*,int,unsigned);
其中void*表示地址。
例如,下面的代碼用數(shù)組做參數(shù)傳遞給標(biāo)準(zhǔn)函數(shù)memset(),以讓其將數(shù)組設(shè)置成全0:
memset()的第一個(gè)實(shí)參是數(shù)組名,數(shù)組名作參數(shù)即數(shù)組作參數(shù),它僅僅只是一個(gè)數(shù)組的起始地址而已。
在函數(shù)memset()棧區(qū),從返回地址往上依次為第1,2,3個(gè)參數(shù)。第1個(gè)參數(shù)中的內(nèi)容是main()函數(shù)中定義的數(shù)組ia1的起始地址。第2個(gè)參數(shù)是給數(shù)組設(shè)置的值(0),第3個(gè)參數(shù)是數(shù)組的長(zhǎng)度(50*2)。函數(shù)返回時(shí),main()函數(shù)的數(shù)組中內(nèi)容全置為0。
std::memset(&v2x_message_, 0, sizeof(v2x_message_));memset 可以使用這種方式直接把結(jié)構(gòu)體v2x_message_中的所有變量都賦值為0.
但是很多時(shí)候,我們不能這么干,當(dāng)某結(jié)構(gòu)體A從上游發(fā)來(lái),其中只有一部分變量沒(méi)有初始化,我們必須只對(duì)沒(méi)有初始化的值進(jìn)行分別初始化,不能像這樣直接全部初始化為0。
所以std::memset(&v2x_message_, 0, sizeof(v2x_message_))這種方式一般只在最初初始化的時(shí)候使用,或者復(fù)位清零時(shí)使用,只要不是這兩種情況,就不要這么使用。
總結(jié)
以上是生活随笔為你收集整理的【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【c++】14.编译proto和prot
- 下一篇: 【c++】11.重写、覆盖、using、