Потому что в C объявление и инициализация сознательно отличаются от шагов .Они намеренно отличаются, потому что так устроен C.
Когда вы говорите это внутри функции:
void demo(void)
{
int *param;
...
}
Вы говорите: «Мой дорогой компилятор C, когда вы создаете стекдля этой функции, пожалуйста, не забудьте зарезервировать sizeof(int*)
байтов для хранения указателя. "Компилятор не спрашивает, что там происходит - он предполагает, что вы скоро это расскажете.Если вы этого не сделаете, может быть, есть лучший язык для вас;)
Может быть, не было бы дьявольски сложно создать некоторый безопасный код очистки стека.Но его нужно вызывать при каждом вызове функции, и я сомневаюсь, что многие разработчики на Си оценят попадание, когда они все равно будут его заполнять.Кстати, вы можете многое сделать для повышения производительности, если вам позволят быть гибкими со стеком.Например, компилятор может выполнить оптимизацию, где ...
Если ваш function1
вызывает другой function2
и сохраняет его возвращаемое значение, или, возможно, есть некоторые параметры, переданные в function2
, которые не 'изменилось внутри function2
... нам не нужно создавать дополнительное пространство, не так ли?Просто используйте одну и ту же часть стека для обоих!Обратите внимание, что это находится в прямом противоречии с концепцией инициализации стека перед каждым использованием.
Но в более широком смысле (и, на мой взгляд, более важно) это согласуется с философией C о том, что не нужно делать намного большечем это абсолютно необходимо.И это применимо, работаете ли вы с PDP11, PIC32MX (для чего я его использую) или Cray XT3.Это точно , почему люди могут использовать C вместо других языков.
- Если я хочу написать программу без следов
malloc
и free
, я не будуне надо!Мне не нужно управлять памятью! - Если я хочу упаковать бит и упаковать объединение данных, я могу!(Конечно, до тех пор, пока я читаю замечания моей реализации по стандартному присоединению.)
- Если я точно знаю, что я делаю со своим стековым фреймом, компилятору больше ничего не нужно делать для меня!
Короче говоря, когда вы просите компилятор C прыгнуть, он не спрашивает, как высоко.Полученный код, вероятно, даже не вернется снова.
Поскольку большинству людей, которые хотят развиваться на C, нравится именно так, у него достаточно инерции, чтобы не изменяться.Ваш путь не может быть изначально плохой идеей, просто многие другие разработчики C его не просят.