Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
1

Что такое стек?

09.09.2015, 19:16. Просмотров 502. Ответов 5
Метки нет (Все метки)

Объясните как они хранятся в памяти и что такое стек. Насколько я понял, стек это как стопка книг. Если взять 3ю книгу сверху, то надо снять 2 выше этой, то есть положил последним и взял первым, но как можно использовать эту особенность? И какие подводные камни могут быть в этом?
В функции можно менять значение переменных глобальных, но они не посылаются в функцию как аргументы. Как функция имеет доступ к ним? Наверное есть особый участок памяти к которому есть доступ у всех функций и блоков, но это мои догадки. Расскажите или отправьте туда где можно об этом почитать.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2015, 19:16
Ответы с готовыми решениями:

Что такое стек?
Нигде не нашёл понятного определения некого стека. Что такое стек, как с ним работать и т.д.?

Кто сможет объяснить что означает в этом коде 0x55555, что это такое, для чего предназначено?
#include "stdafx.h" #pragma warning(disable : 4996) #include <stdio.h> #include <conio.h>...

Что такое е
Double eps=10e-5. Что такое е и что выговодится на экран

Что такое ЯП C?
Подскажите пожалуйста что такое язык C. В Visual Studio его нету. И в интернете даже уроков про...

Что такое в программе k[2], k[i]?
#include <stdio.h> #include <locale> int main () { setlocale(LC_ALL, "RUSSIAN");...

5
smartpointer
70 / 64 / 39
Регистрация: 17.02.2014
Сообщений: 265
09.09.2015, 20:21 2
Попробую объяснить из своих скромных познаний, может кто поправит, если не прав.При входе в функцию в специальный регистр стека кладется адрес возрата из этой функции в функцию (делается специальной ассемблерной инструкцией push), которая ее вызывала либа в ОС в случае если это main() - то есть на вершине стека всегда находится адрес возврата, далее при объявлении и инициализации переменных в функции происходит смещение адресов относительно этого адреса, и как-бы получается стек растет, на Intel-ах например в сторону младших адресов. То есть объявили int, вычетаем -0x4 байта относительно начала стека, для char -0x1 уже относительно int и т.д. Все эти смещения кладутся в спец регистр фрейм стека, поэтому при обращении к переменным они берутся из этого регистра и не обязательно с конца. Размер стека ограничен - устанавливается ОС, поэтому слишком глубокая рекурсия убьет его и вызовет крэш программы. При выходе из функции происходит восстановление стека (инструкцией pop), то есть до адреса его возрата, который был положен в самом начале. Такая система работает при каждом вызове функций.
Цитата Сообщение от Sinkha Посмотреть сообщение
Расскажите или отправьте туда где можно об этом почитать.
Азы ассемблера.Про глобальные и автоматические переменные также прочтешь оттуда, они объявляются в спец секциях .data и .bss
0
Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
Завершенные тесты: 1
09.09.2015, 20:42  [ТС] 3
Цитата Сообщение от smartpointer Посмотреть сообщение
Азы ассемблера.Про глобальные и автоматические переменные также прочтешь оттуда, они объявляются в спец секциях .data и .bss
А вот где такую книжку почитать? Не нашел
0
smartpointer
70 / 64 / 39
Регистрация: 17.02.2014
Сообщений: 265
09.09.2015, 21:19 4
На ветке ассемблера есть литература, там посмотри.
0
Вованя
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 552
Завершенные тесты: 1
11.09.2015, 13:34 5
Цитата Сообщение от Sinkha Посмотреть сообщение
но как можно использовать эту особенность? И какие подводные камни могут быть в этом?
Что значит использовать?
Есть стек, как структура данных, есть
стек, как сегмент данных в памяти процесса.

Цитата Сообщение от Sinkha Посмотреть сообщение
Как функция имеет доступ к ним? Наверное есть особый участок памяти к которому есть доступ у всех функций и блоков
На этапе компиляции в сегменте данных размещается глобальная переменная, которая имеет постоянный относительный адрес, поэтому к ней можно обратиться из любой функции, не передавая адрес параметром. Статическая переменная размещается так же в сегменте, но доступ (видимость) к ней ограничивает только компилятор.

Что нибудь по архитектуре x86 почитай.
Для начала может быть http://habrahabr.ru/company/smart_soft/blog/185226/ подойдет.
0
sammanta
3 / 3 / 0
Регистрация: 31.05.2015
Сообщений: 58
Завершенные тесты: 1
24.09.2015, 13:29 6
в простейшем случае в стек кладутся адреса возврата из подпрограмм как частный случай из прерываний .
Т е выполняется прога, возникает прерывание.
В этот момент программа должна перейти в обработчик этого прерывания, т е скакнуть куда на другой адрес. А откудого програ знает куда вернутся после выполнения прерывания?
Вот чтобы программа знала куда вернутся после выполнения прерывания и служит стек, где хранится адрес, куда должна была попасть программа.
0
24.09.2015, 13:29
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2015, 13:29

Что такое 0x800000000000000UL?
Что вообще значит запись вида: 0x800000000000000UL? Это представление числа в какой-то системе...

Что такое флаги в Си?
Можете объяснить эту тему?

Что такое __iob_func?
Что такое __iob_func? Это указатель на функцию или что-то другое? _CRTIMP FILE * __cdecl...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.