Назначить строку uint8_t - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь использовать uint8_t* для указания первого поля строки.

Вот так выглядит мой код

std::string data1
uint8_t* data

data = (uint8_t*)data1[0]

Что здесь не так? Когда я запускаю его, он падает

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

data[0] возвращает ссылку на первый char в строке (при условии, что строка не пуста, в противном случае возвращаемое значение не определено). Вы приводите тип значение этого char к указателю. Итак, ваш код падает, когда он пытается использовать указатель для доступа к неверному адресу памяти. Вам нужно набрать адрес этого char вместо:

data = (uint8_t*) &data1[0];

Или, более C ++ - иш (и безопаснее):

data = reinterpret_cast<uint8_t*>(&data1[0]);

Или, с проверкой границ:

data = reinterpret_cast<uint8_t*>(&(data1.at(0)));
0 голосов
/ 11 мая 2018

Например, если вы делаете что-то вроде:

std::string data1 = "One"

, тогда data1 [0] дает 'O', значение ASCII которого равно 79. Теперь вы используете это 79 в качестве адреса.

Таким образом, указатель с именем data имеет значение 79.

Поэтому, когда вы снова используете этот указатель в своем коде, вы фактически пытаетесь читать или записывать защищенную память (0x0000004F или 79).Следовательно, он падает во время выполнения.

0 голосов
/ 10 мая 2018

Для того, что вы хотите сделать, вы можете попробовать:

data = (uint8_t*)data1.c_str();

Не знаю точно, чего вы пытаетесь достичь, но наверняка есть лучший подход.

...