Подтвердить что ты не робот

Арифметика указателей для структур

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

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

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

4b9b3361

Ответ 1

struct foobar *p;
p = 0x1000; 
p++;

совпадает с

struct foobar *p;
p = 0x1000 + sizeof(struct foobar);

Ответ 2

Ответ заключается в том, что он не менее

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

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

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

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

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

Обновление

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

Ответ 3

p = p + sizeof(YourStruct)

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

Ответ 4

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

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

Ответ 5

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