2013-10-25 4 views
0

В основном, мой вопрос в том, сколько байтов имеет один или несколько адресов?Сколько байтов занимает адрес?

Я имею в виду char занимает 1 байт на моей платформе и имеет 1 адрес. Но int занимает 4 байта. Сколько адресов делает это int? У него все еще есть только 1 адрес или у него есть 4?

Например:

char c = 'A'; //Address at 0xdeadbeee 
int i = 45846; //Address at 0xdeadbeef 
int* iPtr = &i; 
iPtr++; //Address at 0xdeadbef3 now 

Что происходит с адресами между 0xdeadbeef и 0xdeadbef3? Все ли они зарезервированы для i? Что произойдет с i, когда я укажу на 0xdeadbeee (должен быть ровно один адрес | байт или что-то еще под i) и изменить его значение?

Редактировать: для тех, кто все еще будет отвечать, я не хочу знать, насколько велика целое число. Я хочу знать, имеет ли он 4 адреса при использовании 4 байтов памяти и что происходит (если у него 4 адреса) при изменении значения одного из этих адресов.

Надеюсь, теперь это яснее.

+0

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

+0

«В принципе, мой вопрос в том, сколько байтов имеет один или несколько адресов?» -> 'sizeof (T *)' скажет вам об этом. Но ваш вопрос не в том, что касается «размера адреса». Еще раз, вы спрашиваете, почему арифметика указателя работает так, как она работает. –

+0

Возможный дубликат [Арифметика указателей] (http://stackoverflow.com/questions/394767/pointer-arithmetic) –

ответ

1

Размеры встроенных типов (char, short, int, long) специфичны для конкретной реализации и зависят от конкретной платформы. Если мы предположим, что ваш INT составляет 32 бита, то мы можем решить некоторые вопросы:

Если i находится в 0xdeadbeef, то 0xdeadbeef, 0xdeadbef0, 0xdeadbef1, and 0xdeadbef2 байт адреса будут быть использованы для хранения i.Если вы должны были установить iPtr в 0xdeadbeee и написать значение, 0xdeadbeee, и следующие три адреса будут содержать указанное вами значение. Если вы затем попытаетесь прочитать c или i, вы увидите, что значение искажено.

Некоторые вещи, которые следует учитывать: не все архитектуры допускают байтовую адресацию. A char может быть одним байтом в вашей системе, но из-за ограничений может быть зарезервировано 4 байта. Аналогичным образом, вы не сможете читать или писать указатель, указывающий на неприсоединившиеся адреса. Например, система, которая может иметь доступ только к памяти на 32-битных границах, может получить доступ только к 0xdeadbeec или 0xdeadbef0.

+0

Спасибо! Это ответ, который я искал. – Davlog

+1

По определению в C символ 'char' является адресным.В модели C каждый байт адресуется через указатель 'char'. Если базовое оборудование не поддерживает прямое обращение к своим байтам, то реализация C должна либо создать такую ​​адресацию (путем загрузки целого блока и извлечения его частей, и наоборот путем слияния частей и хранения целого блока) или должна определить его 'char' размер которого зависит от аппаратного блока. Не может быть никакого дополнения для объекта 'char'; он всегда использует один байт, однако реализация C определяет «байт». –

+0

Я уступлю этот момент. Я думал о структурах и отдельных переменных 'char' (static, stack, global), которые могут быть дополнены. В примере кода используется указатель 'int'. Использует ли стандарт C этот неприсоединившийся доступ к типам, не связанным с '' char '? – rjp

0

Адрес относится к началу данных. Таким образом, размер адреса не изменяется в зависимости от размера данных.

Фактический размер адреса зависит от платформы. Во многих новых системах этот размер будет 64 бит. Но мы не можем точно сказать, не зная вашей платформы.

В вашем коде вы можете использовать sizeof(), чтобы получить размерность сообщения.

2

Как вы это узнали? Как насчет:

printf("%zu\n", sizeof(iPtr)); 

Но, как @ Н2СО3 указывает, что вы на самом деле просят о pointer arithmetic. Читайте больше об этом для получения дополнительной информации.

+0

Отредактировано, спасибо. –

+1

Хотя это правильный ответ на вопрос 'сколько байтов имеет адрес have', дальнейшая проза предполагает, что это не то, что OP действительно хотел спросить. –

+0

@ChristianTernus Если я не ошибаюсь, я получаю размер iPtr, который составляет 8 байтов на моей платформе. Я уже знаю размеры. у него столько адресов, сколько байтов. – Davlog

2

Да, адрес &i + 1byte является адресом второго байта i.

Если вы живете на Memory Street 100 в 4 домах, у вас есть четыре адреса. Но эти адреса адресованы различным зданиям. Хотя, в зависимости от вашей почтовой службы, почта не может быть доставлена, если она не является каноническим адресом (то же самое касается доступа к памяти - зависит от платформы).

+0

'& i + 1' - это адрес' int', который будет следовать за 'i'. '(char *) & x + 1' является адресом второго байта' i'. –

+0

@EricPostpischil, извините, я отредактировал слишком много. Оригинал был + 1' * byte * ', а затем я удалил байт вместе со звездами. Починю. Предполагалось, что это не предел, а скорее объяснение. –

+0

Хорошая аналогия. Рассмотрите письмо, отправленное на адрес «101, Memory St.» - и почтальон фактически * доставляет * его по этому адресу. Тем не менее, вы можете никогда не увидеть это письмо, если только проверите свою почту по каноническому адресу. (Аналогия, к сожалению, ломается там: если вы пишете что-то по неправильному адресу * памяти *, ваша программа на C может рухнуть. Дома не делают этого.) – usr2564301

1

Вы можете узнать, сколько байт занимает указатель с помощью sizeof:

size_t int_ptr_size = sizeof(int*); 

Если вы пытаетесь получить доступ к данным через указатель, который не выровнен по типу, вы призываете к неопределенному поведению, так непредсказуемо, что произойдет. На некоторых архитектурах программа выйдет из строя с ошибкой Bus.

0

Все зависит от организации вашей аппаратной платформы. В случае, если память организована в ячейки размером 4 байта, переменная, длина которой ниже или равна 4 байтам (при правильной настройке памяти), удерживается только в одной ячейке памяти, поэтому она указывается только на одно значение одного адреса.

Смежные вопросы