Какова цель размера байта типа переменной, если я знаю адрес переменной?

Я не понимаю цели работы с байтовым размером переменной, зная ее адрес. Например, скажем, я знаю, где хранится переменная int, скажем, она хранится в адресе 0x8C729A09Если я хочу получить int, сохраненный в этом адресе, я могу просто разыменовать адрес и получить номер, сохраненный на нем.

Итак, для чего конкретно нужно знать размер переменной в байтах? Почему это важно, если переменная имеет 4 bytes (будучи int) или же 8 bytes если я могу получить значение переменной, просто разыменовав address? Я спрашиваю об этом, потому что я работаю над разыменованием некоторого адреса, и я подумал, что мне нужно пройти через цикл for, чтобы получить переменную (зная начальный адрес, который является адресом переменной, и размер переменной в байтах) но всякий раз, когда я делаю это, я просто получаю другие переменные, которые также объявлены.

Немного контекста: я работаю над инструментом Pin и получаю адреса глобальных переменных, объявленных в другой программе.

Случай for выглядит примерно так:

for(address1 = (char *) 0x804A03C, limit = address1 + bytesize; address1 < limit; address1++)
      cout <<  *(address1) << "\n";

3 ответа

Решение

Майкл Крелин дал очень компактный ответ, но я думаю, что могу расширить его немного больше.

На любом языке, не только C, вам нужно знать размер по разным причинам:

  • Это определяет максимальное значение, которое может быть сохранено
  • Пространство памяти, которое займет массив этих значений (1000 байтов получат 250 дюймов или 125 длин).
  • Если вы хотите скопировать один массив значений в другой, вам необходимо знать, сколько байтов используется для выделения достаточного пространства.
  • Хотя вы можете разыменовать указатель и получить значение, вы можете разыменовать указатель в другой части этого значения, но только если вы знаете, из скольких байтов он состоит. Вы можете получить высокое значение типа int, взяв только первые два байта, и низкое значение, получив последние два байта.
  • Разные архитектуры могут иметь разные размеры для разных переменных, что повлияет на все вышеперечисленные моменты.

Редактировать:

Также, безусловно, есть причины, по которым вам может понадобиться узнать количество битов, из которых состоит данная переменная. Если вы хотите 32 булевых значения, что не лучше использовать переменную, чем один int, который состоит из 32 бит? Затем вы можете использовать некоторые константы для создания указателей на каждый бит, и теперь у вас есть "массив" логических значений. Обычно они называются битовыми полями (поправьте меня, если я ошибаюсь). В программировании каждая деталь может иметь значение, но не всегда для каждого приложения. Просто подумал, что это может быть интересным упражнением для мышления.

Ответ прост: для внутреннего представления большинства типов требуется более одного байта. Чтобы разыменовать указатель, вы (или вы, или компилятор) должны знать, сколько байтов следует прочитать.

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

Предположим, у вас есть массив переменных. Где вы находите переменную с ненулевым индексом, не зная ее размера? А сколько байтов вы выделяете для массива переменных ненулевой длины?

Другие вопросы по тегам