为什么所有C++数组元素都被设置,而只寻址一个项



我有一个结构数组,需要将CString转换为char数组。这种转换发生在1000个数据点上,输出被写入一个新的数组中。所以我的问题是:我有一个for循环,它遍历CStrings数组,并将它们转换为char数组,然后将其写入我的"新"数组。问题是每次迭代都会将新转换的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_STRING创建/格式化新字符串,则最好按值返回CStringstd::string,并使monitoredNodes成为这些字符串的数组,例如CString monitoredNodes[MAX_TAGS];

最新更新