Итак, я понял это.Следующий код близок к реальному примеру, который я публиковал ранее.
#include <iostream>
#include <string.h>
#include <vector>
const uint8_t arr1[] = {0x00, 0x00, 0x03, 0x00};
const uint8_t arr2[] = {0xA1, 0x00, 0xFF, 0x00};
class A {
public:
struct s1 {
std::string name;
uint8_t const * arr;
};
std::vector<s1, std::allocator<s1>> vect1;
void myPublicMethod(std::string arrName, std::string name) {
uint8_t const * ptr;
if(arrName == "A") {
ptr = arr1;
} else if(arrName == "B") {
ptr = arr2;
}
privateMethod1(ptr, name);
}
void myPublicMethod2() {
auto i = vect1.begin();
for(; i < vect1.end(); i++) {
doPrint(i->arr, i->name);
// here the link between pointers broken,
// doPrint() shows me random characters
}
}
private:
void privateMethod1(uint8_t const * ptr, std::string name) {
// this method receives pointer correctly, so I can doPrint(ptr)
s1 myStruct;
myStruct.name = name;
myStruct.arr = ptr;
vect1.push_back(myStruct);
}
void doPrint(const uint8_t arr[], std::string name) {
for(uint16_t i = 0; i < sizeof(*arr); i++) {
if(name.length() > 0) {
std::cout << arr[i] << '\n';
} else {
std::cout << "No name\n";
}
}
}
};
int main() {
A ca;
ca.myPublicMethod("A", "");
ca.myPublicMethod("B", "image");
ca.myPublicMethod2();
return 0;
}
Этот код - лишь малая часть проекта (основной код).Я считаю невозможным / ненужным публиковать весь проект, потому что есть много ненужных материалов, которые определенно потребуют много времени, чтобы понять.
Сначала я подумал, что есть проблема с указателями, особенно в A :: myPublicMethod, который создает * ptr, который затем передается в A :: privateMethod1 для хранения в vect1.Я ошибся, думая, что при сохранении / переносе в vect1 произошла ошибка.В последнее время я не нашел никаких изменений для vect1 в основном коде.Vector vas создан хорошо, проблема была в методе doPrint, особенно в том, что if (name.length ()> 0) ... Итак, я должен был придерживаться логики основного кода, не выдумывая пример, который был далек отРеальность.
В заключение спасибо @paulmckenzie, который косвенно дал мне повод перестать мыслить указателями.Мне бы очень помогло, если бы кто-то только что подтвердил, что, следуя моему первому примеру, указатели логически верны.
Cheers,