2017-10-28 93 views
0

我有一个问题。strcpy_s缓冲区L缓冲区太小&& 0

我试图proceede以下步骤:

char * str; 
    char * s="Hello"; 
    int len = std::strlen(s); 
     str=new char[len +10]; 
    strcpy_s(str,sizeof(str) ,s); 

但PROGRAMM显示错误,这是我在标题写。

如果我用一个数字替换sizeof(str),例如256,弹出窗口出现,并且消息project.exe触发了一个断点。

我怎样才能解决这个错误与strcpy_s? 谢谢!

+0

当标准库函数没有达到您的期望值时,请查看您调用它们的参数。打印值为'sizeof(str)'的值。 –

回答

0

sizeof(str)给出char*的大小,即而不是分配数组的长度。要解决这个问题,你必须给出分配的长度。在这种情况下,这将是

strcpy_s(str, len + 10, s); 
+0

你能解释一下,为什么我要写len + 10?我以为我必须只做len + 1,因为最终的'\ 0'? – Perilun

+0

因为第二个参数应该是目标缓冲区的大小。有关更多详细信息,请参见http://en.cppreference.com/w/c/string/byte/strcpy。 –

+0

在示例中,源代码中,我看到以下代码部分: char dst [strlen(src)+ 1]; // +1来容纳空终止符,那么为什么我必须使len + 10而不是len +1?并且我有总会让len + 10?我会非常感谢你的指导! – Perilun

0

取决于实现的sizeof(str)回报char*其尺寸是(可能)或者48或(字节)。在你的情况下,它似乎是4这是不足以容纳构成"Hello"文字加上空终止字符的字符。由于没有足够的空间,strcpy_s函数调用undefined behavior。您至少需要6字节,这是空字符的字符数+ 1字节。而不是str=new char[len + 10];你可能意思是str = new char[len + 1];以适应\0角色。因此,你的代码应该是:

#include <iostream> 

int main(){ 
    char* str; 
    char* s = "Hello"; 
    int len = std::strlen(s); 
    str = new char[len + 1]; 
    strcpy_s(str, len + 1, s); 
} 

这就是说比较喜欢std::string C样式的字符数组。