Все здесь полностью зависит от платформы, и на самом деле не о языке C, а о том, как это делает мой компилятор.
sth
имеет статическое (глобальное) хранилище, поэтому его, вероятно, нет в куче, а скорее в сегменте глобальных данных. some_int
действительно находится в фрейме локального стека some_function
. Переменная arg
заполняется в some_function
, но где она живет, зависит от компилятора и того, что обычно называют «соглашением о вызовах»: она может быть размещена и очищена в кадре стека вызывающей или вызываемой стороны, и вызывающим абонентом или вызываемым абонентом, в зависимости от условных обозначений, либо передается в регистр и вообще не помещается в память.