Вопрос задан 27.06.2023 в 18:30. Предмет Информатика. Спрашивает Минюк Лиза.

C++ разработать программу которая выводит адреса сегметов: a) TEXT SEGMENT (main) b) DATA SEGMENT

c) BSS SEGMENT d) HEAP e) STACK
0 0
Перейти к ответам

Ответы на вопрос

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Кудрявцева Саша.

Ответ:

/* memsegments.c */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct mem

{

   char text[100];

   int *p;

} mem;

int cmp_by_address(const void *, const void *);

void print_struct_array(mem *, size_t);

int init_global_var = 10;        /* Initialized global variable */

int global_var;                  /* Uninitialized global variable */

static int init_static_var = 20; /* Initialized static variable in global scope */

static int static_var;           /* Uninitialized static variable in global scope */

int main(int argc, char **argv, char **envp)

{

   static int init_static_local_var = 30;   /* Initialized static local variable */

   static int static_local_var;             /* Uninitialized static local variable */

   int init_local_var = 40;                 /* Initialized local variable */

   int local_var;                           /* Uninitialized local variable */

   int *dynamic_var = (int*)malloc(sizeof(int));  /* Dynamic variable */

   mem structs[] =

   {

       {"Global variable (initialized)", &init_global_var},

       {"Global variable (uninitialized)", &global_var},

       {"Static variable (in global scope, initialized)", &init_static_var},

       {"Static variable (in global scope, uninitialized)", &static_var},

       {"Static variable (in local scope, initialized)", &init_static_local_var},

       {"Static variable (in local scope, uninitialized)", &static_local_var },

       {"Function (code)", (int*)&main },

       {"Environment variable", (int*)&envp[0] },

       {"Local variable (initialized)", &init_local_var },

       {"Local variable (uninitialized)", &local_var },

       {"Dynamic variable", dynamic_var },

   };

   size_t len = sizeof(structs) / sizeof(mem);

   qsort(structs, len, sizeof(mem), cmp_by_address);

   print_struct_array(structs, len);

   free(dynamic_var);

   return 0;

}

int cmp_by_address(const void *a, const void *b)

{

   mem *ma = (mem *)a;

   mem *mb = (mem *)b;

   if ((unsigned)ma->p > (unsigned)mb->p)

       return -1;

   else if ((unsigned)ma->p < (unsigned)mb->p)

       return 1;

   else

       return 0;

}

/* Example struct array printing function */

void print_struct_array(mem *array, size_t len)

{

   size_t i;

   for(i=0; i<len; i++)

       printf("%-50s:\t%p\n", array[i].text, array[i].p);

}

В результате получим:

Environment variable                              :     0xbff52ee0

Local variable (uninitialized)                    :     0xbff529ac

Local variable (initialized)                      :     0xbff529a8

Dynamic variable                                  :     0x871c008

Global variable (uninitialized)                   :     0x804a044

Static variable (in local scope, uninitialized)   :     0x804a040

Static variable (in global scope, uninitialized)  :     0x804a03c

Static variable (in local scope, initialized)     :     0x804a034

Static variable (in global scope, initialized)    :     0x804a030

Global variable (initialized)                     :     0x804a02c

Function (code)                                   :     0x80484ad

Утилита size показывает размер разделов и общий размер для объектных файлов или архивов. Так, для memsegments.o получим:

$ size memsegments.o

  text    data     bss     dec     hex filename

   745      12       8     765     2fd memsegments.o

Объяснение:

0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

В C++ нет стандартных функций для непосредственного получения адресов сегментов памяти, таких как TEXT SEGMENT, DATA SEGMENT, BSS SEGMENT, HEAP и STACK, потому что это зависит от конкретной реализации компилятора и операционной системы. Однако вы можете использовать различные методы и функции, чтобы приближенно получить адреса этих сегментов.

Вот пример программы, которая может показать вам приближенные адреса сегментов:

cpp
#include <iostream> int main() { int stack_var = 42; int* heap_var = new int(123); std::cout << "Address of TEXT SEGMENT (main): " << (void*)main << std::endl; std::cout << "Address of DATA SEGMENT: " << &stack_var << std::endl; std::cout << "Address of BSS SEGMENT: " << &stack_var << std::endl; std::cout << "Address of HEAP: " << heap_var << std::endl; // To get the address of the stack, we can use a local variable's address int* stack_ptr = &stack_var; std::cout << "Address of STACK: " << stack_ptr << std::endl; // Remember to free the dynamically allocated memory delete heap_var; return 0; }

Этот код создает локальные переменные на стеке (stack_var) и в куче (heap_var). Затем он выводит адреса этих переменных, а также адрес функции main, которая находится в TEXT SEGMENT.

Обратите внимание, что получение точных адресов сегментов памяти, таких как DATA SEGMENT и BSS SEGMENT, не всегда возможно из-за ограничений операционной системы и компилятора. Кроме того, адрес STACK будет адресом конкретной переменной на стеке, и он может меняться при выполнении программы.

0 0

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос