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。如果您需要操作字符串,请 as std::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() 功能?

oracle expdp导出报错“字符串缓冲区太小”

执行动态SQL报“字符串缓冲区太小”错误,请问各位高手怎么解决啊

Oracle 数据访问 ORA-06512: 字符串缓冲区太小

Linux字符设备——如果读取缓冲区太小怎么办?

PLSQL - 字符串缓冲区太小