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