распределение памяти в C / C ++

0

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

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

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

спасибо

  • 1
    Память для int гарантированно будет смежной, хотя это не обязательно 4 байта. Другой вопрос зависит от порядка вашей системы.
  • 0
    Что такое смежная память .
Показать ещё 2 комментария
Теги:
memory

3 ответа

6
Лучший ответ

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

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

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

  • 1
    «Int может быть четырьмя байтами, хотя это действительно зависит от компилятора». Больше похоже на "зависит от архитектуры / ABI ".
  • 0
    давайте назовем это «зависимым от реализации» ...
Показать ещё 1 комментарий
2

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

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

Вы можете пройти каждый байт int, как это

#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 -1 003 зависит от конечной цели базовой архитектуры HW:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню