Чтобы понять, как это может произойти, вам нужно понять модель процесса / потока в Linux.Linux следует модели fork-and-exec, унаследованной от UNIX.Процесс, порожденный системным вызовом fork () в этой модели, представляет собой нечто среднее между потоком и процессом Windows.
Когда поток создается (не имеет значения в Linux или в Windows), новый поток разделяет егоадресное пространство с родителем.Оба могут находить одинаковые объекты, обращаясь к одним и тем же адресам.Но эти темы используют разные стеки.В результате локальные переменные обоих потоков гарантированно не будут иметь одинаковые адреса.
Когда процесс создается в среде Windows, ОС с нуля создает совершенно новое адресное пространство и заполняет его памятью и необходимыми данными.,Теоретически локальная переменная обоих процессов может иметь одинаковые адреса, но на практике вероятность этого будет очень низкой.И даже в случае, когда обе переменные будут использовать один и тот же адрес, эти две переменные все равно будут разными объектами.
Процессы UNIX имеют сходство с потоками и с процессами Windows.Как и во втором случае, ОС создаст НОВОЕ адресное пространство для дочернего процесса, но в отличие от Windows, Linux создает его путем ленивого копирования адресного пространства родительского процесса с использованием подхода Copy-On-Write (COW).COW означает, что оба процесса будут совместно использовать одну и ту же память, но до того момента, пока один из них не изменит ее.В момент попытки записи в память операционная система снова будет задействована, чтобы скопировать часть памяти, которая будет изменена, и назначить одну копию родительской, а другую - дочерней.Начиная с этого момента каждый процесс будет работать со своей независимой копией объектов в измененном фрагменте памяти, но они будут иметь те же адреса.То же самое верно для стека и локальных переменных, хранящихся в нем.
В вашем случае у вас есть два дочерних элемента с двумя копиями одного стека, в которых локальные переменные хранятся по одним и тем же адресам, но в разных адресных пространствах.Затем вы запустили один и тот же код для обоих потомков.Другими словами, у вас одинаковое начальное состояние макета стека и выполняется тот же код, который изменяет этот макет таким же образом.В результате у вас будут одинаковые локальные переменные, расположенные по одинаковым адресам.