Указатель арифметики для структур - PullRequest
13 голосов
/ 02 октября 2011

Учитывая определение структуры, которая содержит одну переменную типа double и три int (всего 4 переменные), если p является указателем на эту структуру со значением 0x1000, какое значение имеет p ++?

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

Это в C. Да, я хочу, чтобы значение p после его увеличения.Это 32-битная машина

Ответы [ 5 ]

20 голосов
/ 02 октября 2011
struct foobar *p;
p = 0x1000; 
p++;

совпадает с

struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
3 голосов
/ 02 октября 2011

Арифметика указателя выполняется в единицах размера типа указателя.

Так что, если вы сделаете p++ для указателя на вашу структуру, p увеличится на sizeof *p байтов. то есть просто спросите свой компилятор, насколько велика ваша структура с оператором sizeof.

3 голосов
/ 02 октября 2011

Ответ таков: по крайней мере

sizeof(double) + (3*sizeof(int))

Причина, по которой он "по крайней мере" состоит в том, что компилятор более или менее свободен для добавления отступов по мере необходимости базовогоархитектура, чтобы он соответствовал ограничениям на выравнивание.

Допустим, например, что у вас есть машина с 64-битным словом, как старая машина CDC.(Черт, у некоторых из них были 60-битные слова, поэтому было бы еще страннее.) Далее предположим, что на этой машине sizeof(double) составляет 64 бита, а sizeof(int) - 16 бит.Компилятор может затем разметить вашу структуру как

| double     | int | int | int | 16 bits padding |

, чтобы вся структура могла быть передана через машину в двух ссылках на память, без необходимости сдвигать или путаться.В этом случае sizeof (yourstruct_s) будет 16, где sizeof(double)+ (3*sizeof(int)) равно 48 14.

Обновление

Заметьте, что это также может быть верно и для 32-битной машины: тогда вам может понадобиться заполнение, чтобы оно соответствовало трем словам.Я не знаю современной машины, которая не обращается к байту, поэтому сейчас может быть трудно найти пример, но это может понадобиться группе более старых архитектур.

2 голосов
/ 02 октября 2011
p = p + sizeof(YourStruct)

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

0 голосов
/ 05 февраля 2019

Увеличение базового адреса типа данных равно базовому адресу + sizeof (тип данных)

...