Ответ 1
struct foobar *p;
p = 0x1000;
p++;
совпадает с
struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
Учитывая определение структуры, содержащее одну двойную и три переменные int (всего 4 переменные), если p является указателем на эту структуру со значением 0x1000, какое значение имеет p ++?
Это не домашняя проблема, поэтому не беспокойтесь. Я просто пытаюсь подготовиться к тесту, и я не могу понять эту проблему. Благодаря
Это в C. Да, я хочу, чтобы значение p было увеличено. Это 32-разрядная машина
struct foobar *p;
p = 0x1000;
p++;
совпадает с
struct foobar *p;
p = 0x1000 + sizeof(struct foobar);
Ответ заключается в том, что он не менее
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-битной машине: тогда вам может понадобиться отступы, чтобы они соответствовали трем словам. Я не знаю о современной машине, которая не обращается к байту, поэтому может быть трудно найти пример сейчас, но вам понадобится куча старых архитектур.
p = p + sizeof(YourStruct)
Компилятор может решить, какой размер будет возвращен, если вы не отключите отладку.
Арифметика указателя выполняется в единицах размера типа указателя.
Итак, если вы указали p++
на указатель на свою структуру, p будет продвигаться на sizeof *p
байт. т.е. просто спросите своего компилятора о том, насколько велика ваша структура с оператором sizeof
.
Приращение базового адреса типа данных равно базовому адресу + sizeof (тип данных)