Процесс выделения памяти в C? Это подход сверху вниз или снизу вверх

0
#include<stdio.h> 
int main() 
{
    int a,b,*p,*q; 
    a=10; b=5; p=&a; q=&b; 
    float c=3.4, d=4.3, *r,*t;
    r=&c; t=&d; 
    char s='o'; 
    printf("address of a=%u\n",p); 
    printf("address of b=%u\n",q);
    printf("address of c=%u\n",r); 
    printf("address of d=%u\n",t); 
    printf("address of s=%u\n",&s); 
    return 0; 
}

с такими выводами кода, как

address of a=1999992860
address of b=1999992856
address of c=1999992852
address of d=1999992848
address of s=1999992847

Если распределение памяти находится в режиме "сверху вниз", то как "d" взять 1 байт, являясь переменной float?

Если это подход снизу вверх, который фактически не выполняется, тогда все в порядке.

Теперь, если я буду считать, что подход "снизу вверх" сделан, то, изменив код, который помещает char s='o'

Перед инициализацией int a,b это даст несколько иной результат.

address of 'a=2987907272'
address of 'b=2987907268'
address of 'c=2987907264'
address of 'd=2987907260'
address of 's=2987907279'

Пожалуйста помоги.

  • 6
    Процесс выделения не определяется C - он зависит от реализации.
  • 1
    Пожалуйста, объясните свой вывод, что d занимает 1 байт. Также, пожалуйста, объясните, что вы подразумеваете под терминами «сверху вниз» и «снизу вверх» в этом контексте. В-третьих, объясните, как, по вашему мнению, (что бы это ни было) влияет или ограничивает размеры переменных. Примечание. Если этого не сделать, вопрос, скорее всего, будет закрыт как «Непонятно, что вы спрашиваете».
Показать ещё 5 комментариев
Теги:
pointers
memory
allocation

2 ответа

4

Я думаю, вы спрашиваете, является ли указанный адрес переменной начальным адресом или конечным адресом. Это первый, начальный адрес. Объект, занимающий байты при последовательно увеличивающихся адресах.

Однако обратите внимание, что Holy Standard не ограничивает объект, который находится в последовательных байтах, но вместо этого говорит о области памяти, которая, особенно для поддержки множественного виртуального наследования, может быть несмежной.

На практике, однако, наиболее производный объект занимает смежное хранилище.

  • 0
    Можно также утверждать, что области памяти, которые кажутся смежными в глазах вашей программы, на самом деле не являются таковыми из-за функций безопасности, принятых ядром и оборудованием на выбранной вами платформе. Мне любопытно, почему кто-то хотел бы предсказать этот тип поведения.
  • 1
    @ user2485710: вы должны опубликовать новый вопрос о том, «почему вы хотели бы предсказать этот тип поведения», где «этот тип» включает преобразование логических адресов в физические. Причины, чтобы вникать в это, включают, как всегда, эффективность (подкачки), но это совершенно не связано с вопросом OP, и абсолютно не связано с, возможно, несмежными регионами стандарта, и слишком много, чтобы обсуждать в комментариях. Итак, оставьте новый вопрос. :)
1

В вашем первом выводе переменная s занимает 1 байт в 1999992847. Переменная d занимает диапазон байтов, начиная с 1999992848 и вплоть до 1999992851.

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

Обновить:

Адрес переменной ВСЕГДА начинается ее область. Независимо от направления распределения.

             +----------------------+
1999992847:  |       s              |
             +----------------------+
1999992848:  |       d              |
1999992849:  |                      |
1999992850:  |                      |
1999992851:  |                      |
             +----------------------+
1999992852:  |       c              |
1999992853:  |                      |
1999992854:  |                      |
1999992855:  |                      |
             +----------------------+
1999992856:  |       b              |
1999992857:  |                      |
1999992858:  |                      |
1999992859:  |                      |
  • 0
    Переменные размещаются в стеке от наивысшего до наименьшего адресов. В 1-й ячейке памяти на выходе назначается 19999992860, затем 56, затем 52, а затем 48. Поскольку они занимают 4 байта памяти. Но 'd' также объявляется как целое число. Поэтому s должно начинаться с 1999992844. Согласно этому d занимает только 1 байтовую память. Как? Если мы рассмотрели заполнение, тогда второй вывод в порядке. Но почему заполнение требуется?
  • 0
    Пожалуйста, посмотрите на мою фотографию. Адрес переменной ВСЕГДА является началом ее области. Ваша вторая свалка неясна. Вы не даете точный код, который его сгенерировал.

Ещё вопросы

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