Хотя вам все еще нужно вернуться и отредактировать свой вопрос, чтобы добавить некоторую информацию о том, как ваша программа выходит из строя и что на самом деле означает «локальные переменные удаляются», это тип вещей, которые могут привести к потере значения программой. переменной из другой области видимости.
void inner_function(void) {
int x[1];
memset(x, 0, 10 * sizeof(x));
}
Это на самом деле должно завершиться ошибкой, когда функция пытается вернуться. Это называется переполнением буфера, потому что у вас есть буфер (диапазон памяти, используемый для хранения чего-либо), на который у вас есть разрешение (от языка программирования C), но вы редактируете это и многое другое. Эти «намного больше» данных - это другая память, которую компилятор ожидал, что вы не будете редактировать, как адрес возврата и переменные в других областях.
Этот пример является очень общим случаем и предназначен для того, чтобы его было легко понять, но очень вероятно, что если ваша внутренняя функция страдает от этого типа ошибки, она не будет такой ясной, как эта. Также возможно сделать переполнение буфера, которое не перезаписывает возвращаемое значение, так что inner_function будет возвращаться без сбоев, но тогда вы можете найти измененные локальные переменные из external_function (что, как я думаю, вы говорили, происходит в вашем коде) , но чтобы написать полезный пример этого специально, мне нужно было бы знать намного больше о том, какие платформы, компилятор и опции компилятора вы использовали, чтобы я мог догадаться о том, где в стеке, относительно вершины стек (который является фреймом стека текущей функции), вероятно, будет.