天天看點

strcpy_s與 strcpy的 差別和 遇到的坑

首先

strcpy 是标準c函數數 任何 c/c++ 編譯器都支援

strcpy_s 是微軟定義的,其他編譯器都不支援

strcpy定義:

strcpy_s定義:

errno_t __cdecl strcpy_s(
       char*       	_Destination,
       size_t		_SizeInBytes,
       char const* 	_Source
        );
           

strcpy 隻有兩個參數,當source 的字元串長度大于destination 的空間大小時,就會發生緩沖區溢出。

strcpy_s 的第二個參數代表緩沖區的大小,意在避免copy字元串時發生緩沖區溢出,當_Source字元串長度大于緩沖區大小時,會觸發ASSERT, 提示緩沖區太小。

注意:

當_Source字元串長度小于緩沖區大小時,strcpy_s 函數複制完字元串和末尾的 '\0’并不會停止,而是用0xfe填充後面的緩沖區,直到_SizeInBytes個。

例如:

const char* p1 = "123";
    char buffer[8] = { 0 };
    strcpy_s(buffer,8,p1);
           

此時 buffer 的資料

不是

31 32 33 00 00 00 00 00

而是

31 32 33 00 fe fe fe fe

繼續閱讀