2014-08-31 5 views
0

Когда вы объявляете переменную x типа int в C или C++, я понимаю, что это займет 4 байта памяти. Поэтому для этой переменной выделяются 4 адреса памяти. Мой вопрос: могу ли я увидеть, что все четыре адреса памяти выделяют эту переменную? Я знаю, что это не типичный вопрос, но мне любопытно. Или это на 100% всегда только адрес памяти & x и 3 следующих бита? Итак, если это был адрес памяти 1000, следующий будет 1001, 1002 и 1003? От этого ли это отклоняется?распределение памяти в C/C++

Также говорят, что я устанавливаю x = 5;

Означает ли это, что в этом месте памяти от 1000 до 1002 оно будет заполнено нулями, а в 1003 - 101 (двоичное представление 5) в крайнем правом положении?

Спасибо

+1

в памяти для 'int' гарантированно будет непрерывным, хотя это не требуется 4 байта. Другой вопрос зависит от сущности вашей системы. –

+0

Что такое [непрерывная память] (http://stackoverflow.com/questions/4059363/what-is-a-contiguous-memory-block). – Igor

+0

'& x' предоставит вам адрес первого байта – Quest

ответ

6

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

Да, четыре байта являются последовательными. Итак, вы правы, что &x, а следующие три байта - это местоположение вашей переменной.

Однако ваше предположение о том, что самый правый байт является наименее значимым, справедливо только для машин big-endian. На прямой порядок байтов архитектуры (как х86), самый левый байт будет содержать 101 для представления числа 5.

+1

«Int может быть четыре байта, хотя это действительно зависит от компилятора». Больше похоже «зависит от архитектуры */ABI *». – kay

+0

назовем его «зависимым от реализации» ... – EOF

+0

Прохладный! Я рад, что вы включили большого эндиана и маленького эндианта, я беру организацию машины и просто начал говорить об этом. Благодарю. – Arrow

2

Размер междунар это не всегда 4 байта, это известно только, что

char <= short <= int <= long <= long long 

Вы можете пройти через каждый байт междунар как этого

#include <stdio.h> 

void main() { 
    int A = 10; 
    int *intPtr; 
    char *charPtr; 
    size_t size = sizeof(int); 
    size_t i; 

    intPtr = &A; 
    printf("%d\n", *intPtr); 

    charPtr = (char*) intPtr; 
    for (i = 0; i < size; i++) { 
     printf("%d\n", *(charPtr++)); 
    } 

} 
1

Несколько неточностей:

  1. Размер int зависит от платформы (хотя в большинстве случаев это действительно 4 байта).

  2. Что вы подразумевали под "см. Адрес"? Если вы хотите наблюдать это через отладчик, тогда просто продолжайте, и вы, скорее всего, увидите и соседние адреса. Если вы хотите получить доступ к определенному адресу в пределах int переменных, то вы можете легко сделать с помощью char указателя:

    int x = 5;

    char* p = (char*)&x;

    Вы можете использовать p[i] для того, чтобы получить доступ к любому адресу в диапазон 0<=i<=sizeof(int)-1.

  3. Содержания адреса 1000-1003 зависит от порядок байт от базовой архитектуры HW:

    • На тупоконечника процессора, содержание (от низкого до высокого адреса адреса) 0 0 0 5
    • на Little-Endian процессора, содержимое (от низкого адреса к высокому адресу) будет 5 0 0 0
Смежные вопросы