我必须在c ++类中使用c样式结构(我可以使用字符串,但我必须特别使用带有char数组的C样式结构)
typedef struct
{
char arr[6];
} STYPE1;
class A
{
public:
void SetArr( const char* str ) {
strncpy(m_sTYPE1.arr , str , 5);
m_sTYPE1.arr[5]='\0';
}
private:
STYPE1 m_sTYPE1;
} ;
如何初始化初始化列表中的成员m_sTYPE1
在ctor中没有任何内容时,SetArr
与"ABCDE"
一起调用会因strncpy
崩溃而引发错误。我认为这是因为m_sTYPE1.arr
未正确初始化。如何初始化并稍后设置字符串?
使用C ++字符串可以轻松完成整个过程,但在这里我只对C-Style字符串数组实现感兴趣。
答案 0 :(得分:1)
- 如何在初始化列表中初始化成员m_sTYPE1
醇>
使用列表初始化(在这种情况下进行聚合初始化):
A::A(): m_sTYPE1{} {}
- 在ctor中没有任何内容,请使用" ABCDE"来调用SetArr。 strncpy崩溃时抛出错误。我认为这是因为没有正确初始化m_sTYPE1.arr。
醇>
在构造函数中初始化m_sTYPE1
不会影响SetArr
" 是否会抛出错误"。复制未初始化的内存是完全安全的。如果strncpy
" 崩溃",那么其他地方就会出现错误。无法说出去哪里,因为你的例子并不完整。
答案 1 :(得分:0)
C ++不是Java,你已经声明了私有成员S_TYPE1 m_sTYPE1
,它只会存在于类A
的每个实例中,它不是指针或引用,因此不需要指向或引用现有对象。
如果通过初始化列表表示你想在构造A
时设置字节范围 - 我建议声明一个接受const char* const
的构造函数,然后复制数据从中。如果要移动,请定义一个带char*&&
的构造函数。
然而,看看你的例子,我还要提到数组在C / C ++中是零基础的,因此声明arr[6]
给出0-5
之间的有效索引,6超出范围并且尝试访问它或写入它将导致未定义的行为(读取:可能会使程序崩溃),因此手动设置空终止符的代码行将无效。