@OhMyWatch

Что делается в этой строке?

Я в С++ недавно, хотел бы понять, что происходит в этой строке кода:
const float* data = (float*)things.data;

Можно ли как то обратиться к things без указателей?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
В данной строке:
const float* data

Создается указатель на область памяти. Обращаться к данной области памяти можно как к массиву (пример data[0] или data[13] и т.д.). При этом каждая ячейка имеет тип и размерность в битах как float. При этом память под данный массив не выделена.

= (float*)things.data

А тут берется things.data, которая должна также указывать на некоторую, уже выделенную область памяти. (float*) производит явное преобразование типов. И затем все это присваевается к data. В результате data будет указывать уже на ту же область памяти что и things.data но тип указателя будет float

PS: немного тряхнул стариной)))
Итак, к памяти, лежащей за things.data можно обратится и без вспомогательной переменной data. Делается это примерно так ((float*)things.data)[index]

вот рабочий пример, демонстрирующий это

НО!!!! Вы должны учитывать следующее:
1. При работе с массивами, представленными как ТИП* необходимо убедиться что память выделена.
2. Необходимо точно знать сколько именно памяти выделено.
3. Даже если вы не сделали п.1 и п.2 вы можете ЧИТАТЬ из таких массивов значения по любому индексу, это напрямую не убьет запущенный экземпляр проги, но это бессмысленно в большинстве случаев.
4. При невыполнении п.1 при записи в такие массивы вы почти гарантированно пишете в область памяти, в которой уже лежит что то важное (какието данные вашей проги или даже выполняемый код), и тем самым затираете это, результат непредсказуем.
5. При невыполнении п.2 при записи в такие массивы вы рискуете произвести запись в память, находящуюся за пределами выделенной для массива, и тем самым повторяете П.4, результат непредсказуем.
6. на основе таких ошибок в коде (п.4 и п.5) пишется большинство эксплойтов
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 1 000 до 1 800 usd.
iGooods.ru Санкт-Петербург
от 170 000 до 250 000 руб.
от 75 000 до 120 000 eur.