为什么只解决一项就设置所有C ++数组元素?

时间:2018-11-27 10:42:46

标签: c++ arrays char c-strings

我有一个结构数组,需要将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);
}

我想我在这里做错了什么,但是我尝试了各种方法,包括查看编译器的优化,但是每次遇到相同的问题时,尽管我按索引设置了一个数组项,但以前的所有数组项似乎也被写入了。

1 个答案:

答案 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创建/格式化新字符串,则最好按值返回CStringstd::string并将monitoredNodes组成一个数组,例如CString monitoredNodes[MAX_TAGS];