为什么尽管只解决了一个项目,但所有 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_STRING
creates/formats一个新的字符串,最好把它return一个CString
或者std::string
按值做成monitoredNodes
一个数组,例如CString monitoredNodes[MAX_TAGS];
.
我有一个结构数组,需要将其 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_STRING
creates/formats一个新的字符串,最好把它return一个CString
或者std::string
按值做成monitoredNodes
一个数组,例如CString monitoredNodes[MAX_TAGS];
.