Intereting Posts
Установка минимального и максимального размера windows с помощью WINAPI Корректировка размера структуры C Выход препроцессора на Qt Creator адрес указателя malloc в основной и в другой разнице функций Объявление, инициализация и использование глобальной переменной в том же заголовочном файле Пространство имен функций ANSI C в ISO C ++ fseek для 32-разрядного беззнакового смещения Как напечатать введенную строку назад в C, используя только цикл for Как оптимизировать алгоритм Дейкстры для одного кратчайшего пути между двумя узлами? Переопределение перечислений enum с #define ноль больше или равен нулю, оценивается как false Две переменные с одинаковым именем и типом, в двух разных файлах .c, скомпилируются с gcc Создание fopen () открытых файлов из определенного каталога Определить тип аргумента функции после «)», это очень старый стандарт? Хорошая библиотека SMTP + SSL / TLS для C?

выделение памяти в data / bss / heap и stack

У меня есть следующий код:

#include  int global_var; int global_initialized_var=5; void function(){ int stack_var; printf("The function's stack_var is at address 0x%08x\n", &stack_var); } int main(){ int stack_var; static int static_initialized_var = 5; static int static_var; int *heap_var_ptr; heap_var_ptr = (int *) malloc(4); // Next variables will be at data segment printf("global_initialized_var is at address 0x%08x\n", &global_initialized_var); printf("static_initialized_var is at address 0x%08x\n\n", &static_initialized_var); // These will be in the bss segment printf("static_var is at address 0x%08x\n", &static_var); printf("global_var is at address 0x%08x\n", &global_var); // This will be in heap segment printf("heap_var is at address 0x%08x\n\n", heap_var_ptr); // These will be in stack segment printf("stack_var is at address 0x%08x\n", &stack_var); function(); } 

Я возвращаю следующее:

 # ./memory_segments global_initialized_var is at address 0x0804a018 static_initialized_var is at address 0x0804a01c static_var is at address 0x0804a028 global_var is at address 0x0804a02c heap_var is at address 0x09285008 stack_var is at address 0xbf809fbc The function's stack_var is at address 0xbf809f8c 

Предполагается, что первые 2 переменные, поскольку они инициализированы статическим и глобальным, должны быть в сегменте .data, где остальные 2 static_var и global_var должны находиться в сегменте .bss. Адреса, которые я получаю, я думаю, подразумевают, что оба они находятся в одной области памяти. Я бы сделал слепое предположение, и я бы сказал, что это сегмент .bss.

В любом случае вопрос следующий: я прав? И если я, то как можно узнать, где «пределы» этих регионов (bss, data и т. Д.) Или откуда они начинаются и т. Д.

Предполагая, что вы компилируете что-то вроде gcc memaddr.c -g -o memaddr , вы можете использовать objdump -h для отображения размера и адреса ваших разделов:

 $ objdump -h memaddr |  grep -e 'Размер' -e '\ .data' -e '\ .bss'
 Idx Размер имени VMA LMA Файл выключен Algn
  23 .data 00000018 0000000000601018 0000000000601018 00001018 2 ** 3
  24 .bss 00000018 0000000000601030 0000000000601030 00001030 2 ** 3
 $

Также вы можете использовать objdump -t для отображения адресов и разделов, к которым принадлежат ваши символы:

 $ objdump -t memaddr |  grep "_var"
 000000000060102c l O .data 0000000000000004 static_initialized_var.2049
 0000000000601040 l O .bss 0000000000000004 static_var.2050
 0000000000601044 g O .bss 0000000000000004 global_var
 0000000000601028 g O .data 0000000000000004 global_initialized_var
 $

Таким образом, мы можем видеть, что разделы .data и .bss довольно малы и находятся рядом друг с другом, поэтому неудивительно, что адреса .data и .bss так близки.