This question already has answers here:
How can I prevent strncpy_s from padding destination buffer in debug build?
                                
                                    (2个答案)
                                
                        
                                去年关闭。
            
                    
我有以下C ++代码:

std::string test = "ABC";
char buffer[30];

for (int i = 0; i < 30; i++)
    buffer[i] = 0;

strcpy_s(buffer, 30, test.c_str());


运行它之后,我希望buffer为:
[0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, ... 0x00]直到其结尾(第29位)。

在VS2012中运行,我得到以下结果:
[0x41, 0x42, 0x43, 0x00, 0xFE, 0xFE, 0xFE, ... 0xFE]

为什么strcpy_s复制的长度超过我的字符串长度(3个字符+ \ 0)? 0xFE是从哪里来的?

最佳答案

这由strcpy_s允许:


  为了提高效率,允许strcpy_s从写入的最后一个字符到destsz破坏目标数组:它可以复制为多字节块,然后检查空字节。

关于c++ - strcpy_s将超过字符串长度的内容复制到目标缓冲区(用0xFE填充),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49260844/

10-11 04:29