我有一个结构数组,需要将CString转换为char
数组。这种转换发生在1000个数据点上,并且输出被写入一个新的数组中。所以我的问题是:我有一个for循环,该循环遍历CStrings数组并将其转换为char
数组,并将其写入我的“ new”数组。问题在于,每次迭代都会将新转换的char
数组写入所有先前的数组元素。例如newArr[0]
= oldArr[0]
=工作。 newArr[1]
= oldArr[1]
但现在newArr[0]
也= oldArr[1]
。然后newArr[2]
= oldArr[2]
,但又是newArr[0]
,newArr[1]
和newArr[2]
= oldArr[2]
。
我的代码如下:
for (size_t i = 0; i < MAX_TAGS; i++)
{
char nodeStr[40];
strcpy_s(nodeStr, (strlen(theConf.confP[i].nodeID) + 1), theConf.confP[i].nodeID);
monitoredNodes[i] = UA_NODEID_STRING(theConf.confP[i].namespaceIndex, nodeStr);
}
我想我在这里做错了什么,但是我尝试了各种方法,包括查看编译器的优化,但是每次遇到相同的问题时,尽管我按索引设置了一个数组项,但以前的所有数组项似乎也被写入了。
答案 0 :(得分:2)
您会在每次迭代循环中继续创建和销毁char nodeStr[40]
缓冲区。该缓冲区是在先前迭代所驻留的缓冲区所在的堆栈地址处创建的,这就是为什么您看起来像覆盖先前值的原因。您可能希望该缓冲区持久存在而不是被覆盖。
您可能不需要复制字符串,只需使用其内部的零终止缓冲区即可:
for(size_t i = 0; i < MAX_TAGS; ++i) {
char const* nodeStr = theConf.confP[i].nodeID.GetBuffer();
monitoredNodes[i] = UA_NODEID_STRING(theConf.confP[i].namespaceIndex, nodeStr);
}
如果UA_NODEID_STRING
创建/格式化新字符串,则最好按值返回CString
或std::string
并将monitoredNodes
组成一个数组,例如CString monitoredNodes[MAX_TAGS];
。