Почему все элементы массива C ++ устанавливаются, несмотря на то, что они адресованы только одному элементу? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть массив структур, для которых мне нужно преобразовать 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);
}

Полагаю, я что-то здесь не так сделал, но я пробовал все виды, включая просмотр оптимизаций компилятора, но каждый раз это одна и та же проблема,несмотря на то, что я устанавливал элемент массива по индексу, все предыдущие элементы массива, похоже, тоже записываются.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы продолжаете создавать и уничтожать буфер 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];.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...