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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【c++】10. memset()、【strcpy_s()、memcpy_s()】、【strcpy(),memcpy()】

發布時間:2025/3/21 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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()的用法:

errno_t memcpy_s(void *dest,size_t numberOfElements,const void *src,size_t count ); // 注意,numberOfElements >= count,否則會出現異常

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()函數常用于內存空間初始化。如:

char str[100]; memset(str,0,100);

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:

#include<mem.h> void main() {int ia1[50]int ia2[500]memset(iai,0,50*sizeof(int))memset(ia2,0,500*sizeof(int))}

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()】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。