Где в памяти хранятся мои переменные в C?
Я думаю, что они будут распределены следующим образом:
- глобальные переменные -------> сведения
- статические переменные ------- >данные
- постоянные типы данных - - - - - > код
- локальные переменные (объявленные и определенные в функциях) --------> стек
- переменные, объявленные и определенные в основной функции - - - - - > куча
- указатели (например,
char *arr,int *arr) -------> кучи - динамически выделенное пространство (с помощью malloc и calloc) --------> стек
Я имею в виду эти переменные только из C перспектива.
пожалуйста, поправьте меня, если я ошибаюсь, так как я новичок в с.
7 ответов:
вы получили некоторые из этих прав, но тот, кто писал вопросы обманул вас, по крайней мере на один вопрос:
- глобальные переменные - - - - - - - > данные (правильно)
- статические переменные - - - - - - - > данные (правильно)
- постоянные типы данных - - - - - > код и/или данные. Рассмотрим строковые литералы для ситуации, когда сама константа будет храниться в сегменте данных, а ссылки на нее будут встроены в код
- локальные переменные(объявленные и определено в функциях) --------> стек (правильно)
- переменные, объявленные и определенные в -0-->
кучутакже стек (учитель пытался вас обмануть)- указателей(пример:
char *arr,int *arr) ------->кучуданные или стек, в зависимости от контекста. C позволяет объявить глобальный илиstaticуказатель, в этом случае сам указатель окажется в сегменте данных.- динамически выделенное пространство(с помощью
malloc,calloc,realloc) -------->стеккучустоит отметить, что "стек" официально называется "автоматический класс памяти".
для тех будущих посетителей, которые могут быть заинтересованы в знании об этих сегментах памяти, я пишу важные моменты о 5 сегментах памяти в C:
некоторые головы:
- всякий раз, когда выполняется программа C, в ОЗУ выделяется некоторая память для выполнения программы. Эта память используется для хранения наиболее часто выполняемого кода (двоичных данных), программные переменные и т. д. Ниже сегменты памяти говорит о то же самое:
- обычно существует три типа переменных:
- локальные переменные (также называемые автоматическими переменными в C)
- глобальные переменные
- статические переменные
- вы можете иметь глобальные статические или локальные статические переменные, но вышеуказанные три являются родительскими типами.
5 сегментов памяти в C:
1. Сегмент Кода
- код сегмент, также называемый сегментом текста, является областью памяти, которая содержит часто выполняемый код.
- сегмент кода часто доступен только для чтения, чтобы избежать риска переопределения программными ошибками, такими как переполнение буфера и т. д.
- сегмент кода не содержит переменных программы, таких как локальная переменная (также называется автоматическими переменными в C), глобальные переменные и т. д.
- на основе реализации C, сегмент кода также может содержат строковые литералы только для чтения. Например, когда вы делаете
printf("Hello, world")затем строка "Hello, world" создается в сегменте кода/текста. Вы можете проверить это с помощью в ОС Linux.- более дальнеишее чтение
Сегмент Данных
сегмент данных разделен на две части ниже и обычно лежит ниже области кучи или в некоторых реализациях выше стека, но сегмент данных никогда не лежит между кучей и стеком область.
2. Неинициализированный сегмент данных
- этот сегмент также известен как bss.
- это часть памяти, которая содержит:
- неинициализированные глобальные переменные(включая указатель переменных)
- неинициализированные константы глобальные переменные.
- Неинициализированная локальная статика переменные.
- любая глобальная или статическая локальная переменная, которая не инициализирована будет храниться в неинициализированный сегмент данных
- например: глобальная переменная
int globalVar;или статическая локальная переменнаяstatic int localStatic;будет храниться в сегмент неинициализированных данных.- если вы объявляете глобальную переменную и инициализировать ее как
0илиNULLтогда все равно он пойдет в неинициализированный сегмент данных или bss.- далее чтение
3. Инициализированный сегмент данных
- этот сегмент магазинах:
- инициализированные глобальные переменные(включая указатель переменных)
- значение константы глобальные переменные.
- инициализированные локальные статические переменные.
- например: глобальная переменная
int globalVar = 1;или статический локальная переменнаяstatic int localStatic = 1;будет храниться в инициализировать сегмент данных.- этот сегмент может быть далее классифицируется на инициализированную область только для чтения и инициализированную область чтения-записи. инициализированные постоянные глобальные переменные будут находиться в инициализированной области только для чтения, а переменные, значения которых могут быть изменены во время выполнения, будут находиться в инициализированной области чтения-записи.
- размер этого сегмента определяется размер значения в исходном коде программы, и не изменяется во время выполнения.
- более дальнеишее чтение
4. Стек Сегмент
- сегмент стека используется для хранения переменных, которые создаются внутри функции (функция может быть основной функцией или определяемой пользователем функцией), переменная как
- локальные переменные функции (включая указатель переменные)
- аргументы передаются в функцию
- обратный адрес
- переменные, хранящиеся в стеке, будут удалены, как только завершится выполнение функции.
- более дальнеишее чтение
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