为什么尽管只解决了一个项目,但所有 C++ 数组元素都得到了设置?

Why do all C++ array elements get set despite addressing just one item?

我有一个结构数组,需要将其 CString 转换为 char 数组。此转换针对 1000 个数据点进行,输出被写入一个新数组。所以我的问题是:我有一个循环遍历 CString 数组并将它们转换为 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);
}

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

您在每个迭代循环中不断创建和销毁 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_STRINGcreates/formats一个新的字符串,最好把它return一个CString或者std::string按值做成monitoredNodes 一个数组,例如CString monitoredNodes[MAX_TAGS];.