Схема памяти программы на C - PullRequest
0 голосов
/ 12 октября 2019

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

#include <stdio.h>
#include <stdlib.h>

int f(int i,int j, int *ptr);

int main (int argc, char *argv[]) {
 int a=2;
 int b=4;
 int *age = malloc(sizeof(int));
 *age =0;
 *age +=a;
 printf("Main Address of local variable a=%u,b=%u and *age=%u and address of dynamic variable %u\n", (unsigned int)&a,(unsigned int)&b,(unsigned int) &age, (unsigned int) age);

f(a,b, age);
 return 0;
}

int f(int i,int j, int *ptr) {
 printf("Function f: address of local variable a=%u,b=%u and address of dynamic variable %u\n (unsigned int) &i,(unsigned int)&j,(unsigned int) ptr);
}

Выход:

ubuntu@ubuntu-VirtualBox:~/code$ ./var0
Main Address of local variable a=3212861652,b=3212861656 and
*age=3212861660 and address of dynamic variable 158076936
Function f: address of local variable
a=3212861616,b=3212861620 and address of dynamic variable
158076936

1 Ответ

0 голосов
/ 12 октября 2019

Как правило, память распределяется следующим образом:

High Addresses
--------------
|    Stack    |
---------------
|             |
---------------
|    Heap     |
---------------
| Static Data |
---------------
|    Code     |
---------------
 Low Adresses

Когда вы инициализируете локальную переменную, например a, b, age, каждая переменная может занимать пространство в стеке, которое определяется еетип. Другими словами, он получает свой собственный адрес в стеке. Обратите внимание, что из-за способа размещения памяти эти переменные имеют более высокие значения адресов, что согласуется с приведенной выше диаграммой. Теперь поймите, что адрес a равен 3212861652, а его значение равно 2;адрес age равен 3212861660, а его значение равно 158076936.

Это значение age является адресом памяти в куче. Это то, что возвращается при вызове malloc. Когда вы malloc(sizeof(int)), вы запрашиваете адрес в куче, который можно использовать для свободного хранения sizeof(int) байт. Куча намного ниже, поэтому значение age намного меньше адреса, по которому она хранится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...