strncpy_s - 缓冲区太小断言
Posted
技术标签:
【中文标题】strncpy_s - 缓冲区太小断言【英文标题】:strncpy_s - buffer is too small assertation 【发布时间】:2017-10-03 08:28:51 【问题描述】:作为一个小程序的一部分,我需要将一个字符串转换为一个字符数组。我想使用 strncpy_s() 方法,但我不断收到断言说“缓冲区太小”。 这是我的代码的样子:
char* ostr = new char[sizeof(str)+1];
strncpy_s(ostr, sizeof(ostr), str.c_str(), sizeof(ostr));
希望有人可以帮助我。
【问题讨论】:
这可能是XY problem。如果您需要操作字符串,请 asstd::string
,如果您需要将 char*
传递给 c 风格的函数,请使用成员 c_str()
【参考方案1】:
变量str
似乎是一个std::string
对象。对象的大小是其成员变量的大小,对于std::string
,它通常是一个指针(指向实际字符串)和字符串长度的变量。
如果你想得到被包装字符串的长度,你需要使用length
函数。
此外,您对strncpy_s
的调用还有另一个问题:您使用sizeof(ostr)
,这是指针的大小,而不是它指向的内存大小。 p>
最后,如果您想将指向字符串的指针传递给 C 函数,则可以直接在调用中使用 str.c_str()
。或者,如果 C 函数需要修改字符串(但不重新分配),则使用例如str.data()
或 &str[0]
。
如果 C 函数需要重新分配数据,那么您不能使用new[]
来分配它。你需要使用malloc
(或者可能是strdup
,如果你的系统有的话)。
【讨论】:
以上是关于strncpy_s - 缓冲区太小断言的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 strncpy_s() 函数实现 strncpy() 功能?
执行动态SQL报“字符串缓冲区太小”错误,请问各位高手怎么解决啊