Где в памяти хранятся мои переменные в C?



Я думаю, что они будут распределены следующим образом:




  • глобальные переменные -------> сведения

  • статические переменные ------- >данные

  • постоянные типы данных - - - - - > код

  • локальные переменные (объявленные и определенные в функциях) --------> стек

  • переменные, объявленные и определенные в основной функции - - - - - > куча

  • указатели (например, char *arr,int *arr) -------> кучи

  • динамически выделенное пространство (с помощью malloc и calloc) --------> стек


Я имею в виду эти переменные только из C перспектива.



пожалуйста, поправьте меня, если я ошибаюсь, так как я новичок в с.

995   7  

7 ответов:

вы получили некоторые из этих прав, но тот, кто писал вопросы обманул вас, по крайней мере на один вопрос:

  • глобальные переменные - - - - - - - > данные (правильно)
  • статические переменные - - - - - - - > данные (правильно)
  • постоянные типы данных - - - - - > код и/или данные. Рассмотрим строковые литералы для ситуации, когда сама константа будет храниться в сегменте данных, а ссылки на нее будут встроены в код
  • локальные переменные(объявленные и определено в функциях) --------> стек (правильно)
  • переменные, объявленные и определенные в -0-->кучу также стек (учитель пытался вас обмануть)
  • указателей(пример: char *arr,int *arr) -------> кучу данные или стек, в зависимости от контекста. C позволяет объявить глобальный или static указатель, в этом случае сам указатель окажется в сегменте данных.
  • динамически выделенное пространство(с помощью malloc,calloc,realloc) --------> стек кучу

стоит отметить, что "стек" официально называется "автоматический класс памяти".

для тех будущих посетителей, которые могут быть заинтересованы в знании об этих сегментах памяти, я пишу важные моменты о 5 сегментах памяти в C:

некоторые головы:

  1. всякий раз, когда выполняется программа C, в ОЗУ выделяется некоторая память для выполнения программы. Эта память используется для хранения наиболее часто выполняемого кода (двоичных данных), программные переменные и т. д. Ниже сегменты памяти говорит о то же самое:
  2. обычно существует три типа переменных:
    • локальные переменные (также называемые автоматическими переменными в C)
    • глобальные переменные
    • статические переменные
    • вы можете иметь глобальные статические или локальные статические переменные, но вышеуказанные три являются родительскими типами.

5 сегментов памяти в C:

1. Сегмент Кода

  • код сегмент, также называемый сегментом текста, является областью памяти, которая содержит часто выполняемый код.
  • сегмент кода часто доступен только для чтения, чтобы избежать риска переопределения программными ошибками, такими как переполнение буфера и т. д.
  • сегмент кода не содержит переменных программы, таких как локальная переменная (также называется автоматическими переменными в C), глобальные переменные и т. д.
  • на основе реализации C, сегмент кода также может содержат строковые литералы только для чтения. Например, когда вы делаете printf("Hello, world") затем строка "Hello, world" создается в сегменте кода/текста. Вы можете проверить это с помощью в ОС Linux.
  • более дальнеишее чтение

Сегмент Данных

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

2. Неинициализированный сегмент данных

  • этот сегмент также известен как bss.
  • это часть памяти, которая содержит:
    1. неинициализированные глобальные переменные(включая указатель переменных)
    2. неинициализированные константы глобальные переменные.
    3. Неинициализированная локальная статика переменные.
  • любая глобальная или статическая локальная переменная, которая не инициализирована будет храниться в неинициализированный сегмент данных
  • например: глобальная переменная int globalVar; или статическая локальная переменная static int localStatic; будет храниться в сегмент неинициализированных данных.
  • если вы объявляете глобальную переменную и инициализировать ее как 0 или NULL тогда все равно он пойдет в неинициализированный сегмент данных или bss.
  • далее чтение

3. Инициализированный сегмент данных

  • этот сегмент магазинах:
    1. инициализированные глобальные переменные(включая указатель переменных)
    2. значение константы глобальные переменные.
    3. инициализированные локальные статические переменные.
  • например: глобальная переменная int globalVar = 1; или статический локальная переменная static int localStatic = 1; будет храниться в инициализировать сегмент данных.
  • этот сегмент может быть далее классифицируется на инициализированную область только для чтения и инициализированную область чтения-записи. инициализированные постоянные глобальные переменные будут находиться в инициализированной области только для чтения, а переменные, значения которых могут быть изменены во время выполнения, будут находиться в инициализированной области чтения-записи.
  • размер этого сегмента определяется размер значения в исходном коде программы, и не изменяется во время выполнения.
  • более дальнеишее чтение

4. Стек Сегмент

  • сегмент стека используется для хранения переменных, которые создаются внутри функции (функция может быть основной функцией или определяемой пользователем функцией), переменная как
    1. локальные переменные функции (включая указатель переменные)
    2. аргументы передаются в функцию
    3. обратный адрес
  • переменные, хранящиеся в стеке, будут удалены, как только завершится выполнение функции.
  • более дальнеишее чтение

5. Сегмент Кучи

  • этот сегмент предназначен для поддержки динамического выделения памяти. Если программист хочет выделить некоторые память динамически, то в C это делается с помощью malloc,calloc или realloc методы.
  • например, когда int* prt = malloc(sizeof(int) * 2) тогда восемь байт будут выделены в куче и адрес памяти этого местоположения будет возвращен и сохранен в ptr переменной. Элемент ptr переменная будет находиться либо в стеке, либо в сегменте данных в зависимости от способа ее объявления/использования.
  • более дальнеишее чтение

исправлены ваши неправильные предложения

constant data types ----->  code //wrong

локальные постоянные переменные - - - - - > стек

инициализированная глобальная постоянная переменная - - - - - > сегмент данных

неинициализированная глобальная постоянная переменная - - - - - > bss

variables declared and defined in main function  ----->  heap //wrong

переменные, объявленные и определенные в основной функции - - - - - > стек

pointers(ex:char *arr,int *arr) ------->  heap //wrong

dynamically allocated space(using malloc,calloc) --------> stack //wrong

указатели (например: char * arr, int * arr) -------> размер этой переменной указателя будет в стеке.

считайте, что вы выделение памяти из n байт (с помощью malloc или calloc) динамически, а затем сделать указатель переменной, чтобы указать его. Теперь это n байты памяти находятся в куче, а переменная указателя requries 4 байта (если 64-битная машина 8 байт), которая будет находиться в стеке для хранения начального указателя n байт блока памяти.

Примечание: переменные указателя могут указывать на память любого сегмента.

int x = 10;
void func()
{
int a = 0;
int *p = &a: //Now its pointing the memory of stack
int *p2 = &x; //Now its pointing the memory of data segment
chat *name = "ashok" //Now its pointing the constant string literal 
                     //which is actually present in text segment.
char *name2 = malloc(10); //Now its pointing memory in heap
...
}

динамически выделенное пространство(с помощью malloc, calloc) --------> куча

популярная архитектура рабочего стола делит виртуальную память процесса на несколько сегментов:

  • фрагмент текста, содержит исполняемый код. Указатель инструкции принимает значения в этом диапазоне.

  • сегмент данных: содержит глобальные переменные (т. е. объекты со статической связью). Подразделяется на данные только для чтения (например, строковые константы) и неинициализированные данные ("BSS").

  • сегмент стека содержит динамический память для программы, т. е. свободное хранилище ("куча") и локальные кадры стека для всех потоков. Традиционно с стека и кучи росли в сегменте стека с противоположных концов, но я считаю, что практика была оставлена, потому что это слишком опасно.

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

на других платформах, таких как старый x86 real mode или на встроенных устройствах, все, очевидно, может радикально отличаться.

Я имею в виду эти переменные только с точки зрения Си.

С точки зрения язык C, все, что имеет значение-это экстент, область, связь и доступ; точно, как элементы отображаются на разные сегменты памяти, зависит от индивидуальной реализации, и это будет отличаться. Языковой стандарт не говорит о сегментах памяти на всех. Большинство современных архитектур действуют в основном так же; переменные области блока и аргументы функции будут выделены из стека, переменные области файла и статические переменные будут выделены из сегмента данных или кода, динамическая память будет выделена из кучи, некоторые постоянные данные будут храниться в сегментах только для чтения и т. д.

указатели(например: char * arr, int * arr) - - - - - - - > куча

Неа, они могут быть в стеке или в сегменте данных. Они могут указывать куда угодно.

  • переменные / автоматические переменные - - - > раздел стека
  • динамически выделяемые переменные - - - > раздел кучи
  • инициализированные глобальные переменные - > раздел данных
  • неинициализированные глобальные переменные - > раздел данных (bss)
  • статические переменные -> раздел
  • строковые константы - > раздел текста / раздел кода
  • функции -> текст раздел/код
  • текстовый код -> раздел текста / раздел кода
  • регистры> регистры процессора
  • входы командной строки - > раздел окружающей среды / командной строки
  • переменные среды - > раздел среды / командной строки

Comments

    Ничего не найдено.