C/C++

Эксперимент над стековыми примитивными типами...

 struct St{ 
int ivar;
};

int main()
{
// программа должна поместить в системный
int ivar = 100; // стек
int ivar2 = 200; // из
int ivar3 = 300; // этих
St st; st.ivar = 400; // примитивных типов.


int * iref = &ivar; // но я беру и ссылаюсь на кучу по адресу кусочка этого стека

// после чего я могу итерироваться
// по стеку смещая указатель получая все примитивы:
cout
*$~._.ч.и.п.о.л ._.~$*
*$~._.ч.и.п.о.л ._.~$*
10 755
Вот так примерно выглядит карта памяти для процесса, написанного на языке Си. Только стек распределен заранее и имеет небольшой размер, в районе 1 мб для visual c++.
Тамерлан Асамбаев
Тамерлан Асамбаев
30 155
Лучший ответ
*$~._.ч.и.п.о.л ._.~$* Аа терь понял. Стек просто представляет данные в виде стека но использует при этом оперативу. А куча это неупорядоченный объем памяти в оперативе... Просто неоднократно слышал если куча то оператива а если стек то где то в другом месте)))) все мне теперь все стало ясно
 int * iref = &ivar; // вы ссылаетесь не на кучу а на адрес первого элемента помещенного в стек. 
Можете взять что-то из кучи и сравнить адреса.
 int * iref2 = new int{}; //оператор new выделяет память из кучи
cout
*$~._.ч.и.п.о.л ._.~$* Но сам стек образован из кучи. Поэтому можно говорить о стеке как об упорядоченной куче. Поэтому ссылаясь на адрес примитивнтго элемента стека мы ссылаемся на упорядоченную область памяти в куче. Я думаю так.
*$~._.ч.и.п.о.л ._.~$* Все я понял...
У вас system access violation (нарушение системных прав доступа). Так делать нельзя. Windows отлавливает такую попытку и не дает вам сломать систему, уничтожив или взломав другой процесс операционной системы или всю систему. В самом тяжелом случае это будет поломка всей операционной системы.
Системные права доступа принадлежат ядру Windows, или ядру Linux, или ядру Unix, в которых действует виртуальная машина, которая проверяет ваш код на правильность, отладчик ядра, система безопасности.
Куча выделяется с помощью CreateHeap на пользовательском уровне.
Если вы хотите, чтобы было так, как у вас написано, то вам нужно писать системный драйвер sys для ядра системы с помощью windows driver kit (wdk/ddk), который будет иметь полные права доступа и будет делать с операционной системой все, что хочет.
Александр Ким
Александр Ким
42 166
Сергей Смышляев В исходном коде в вопросе нет нарушения прав доступа и никакой драйвер для подобного эксперимента не нужен.
Естественно, они лежат в памяти - где еще?
Но вот порядок тебе не гарантируют, смотри ассемблер:Например, тут если брать int * iref = &ivar; за базу, только iref и iref - 1 попадают в результаты, и то iref - 1 дает st.ivar
*$~._.ч.и.п.о.л ._.~$* Понял теперь. А я думал стек это какая то флешпамять процессора... Спасибо что объяснили.
Это значит, что стек находится в какой-то системной куче, в оперативной памяти
Maksim Sial
Maksim Sial
953
*$~._.ч.и.п.о.л ._.~$* Вот я тоже так думаю, только сейчас решил проверить это.