C масштабируется целое число - PullRequest
0 голосов
/ 07 апреля 2019

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

URL источника: https://wiki.sei.cmu.edu/confluence/plugins/servlet/mobile?contentId=87152330#content/view/87152330

Большое спасибо.

1 Ответ

0 голосов
/ 08 апреля 2019

Частично проблема заключается в том, что источник, по-видимому, использует термины «масштабированный» и «преобразованный» взаимозаменяемо.

Масштабирование, на которое они ссылаются в одном смысле, - это масштабирование, выполняемое только в контекстеарифметика указателей.Например:

int buffer[5];
int *pi = buffer;
pi += 2;

Адрес, на который изначально указывает pi, представляет собой один байт или char.Но когда к нему добавляется 2, адрес увеличивается на 8 или 16 байтов, в зависимости от того, является ли система 32-битной или 64-битной системой.Это связано с тем, что размер int составляет 4 или 8 байтов.Таким образом, используемое действительное значение называется масштабированным.

Другой смысл использования термина «масштабированный» в источнике - это когда он относится, например, к значению size_t, являющемуся «масштабируется по int ", а затем снова масштабируется.

Это сбивает с толку, потому что на самом деле это означает, что значение size_t преобразуется в int (для допустимой арифметики указателей), а затем масштабируется вконтекст этой арифметики.

В тех случаях, когда это становится проблемой для арифметики указателей, разумеется, независимо от того, теряет ли преобразование информацию.

Главное, что следует помнить об арифметике указателей, - это всегдаубедитесь, что значение, которое, по вашему мнению, вы используете, на самом деле является значением, которое вы фактически используете.

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