Я хочу создать функцию, которая возвращает указатель на локально определенную переменную. Ради аргумента я вызову функцию struct awesome *makeCoolStruct()
(я не хочу объявлять переменную во внешней области видимости, которая должна иметь вызов struct awesome coolness = makeCoolStruct();
, потому что функция будет вызываться более чем в одном месте).
Я понимаю, почему компилятор выдает ошибку, когда я пытаюсь это сделать - локальная переменная будет «уничтожена», как только программа выйдет из этой области, поэтому указатель в основном будет недействительным.
Я посмотрел, как вернуть указатель на локальную переменную в функции, и, хотя я понимаю, почему malloc
будет работать, это лишает цели попытки сделать это таким образом, потому что malloc
, насколько я понимаю,хранит переменную до тех пор, пока работает программа - или до вызова free
. Однако это означает, что мне нужно будет вызывать free
в конце всего, что вызывает мою функцию. В этот момент лучше объявить переменную в каждой вызывающей области, а затем передать указатель на нее, например makeCoolStruct(&existingVariable);
.
Если, однако, есть способ объявить «оставьте эту переменную для 1«Положение выше в стеке» (что, очевидно, приведет к ошибке компиляции в глобальной области видимости, так как в стеке нет более высоких позиций), тогда я мог бы вернуть указатель, и он будет существовать очень хорошо, пока он мне нужен, где бы я ни решил позвонить struct awesome x = makeCoolStruct();
(я знаю о проблемах изменчивости - я не ищу изменчивость). С этого момента я мог действительно вернуть все, что захочу, в функции, а не только то, что было передано.
Я действительно ничего не пробовал, потому что не знаю ничего, что могло бы сработать.
Я ожидаю, что смогу вернуть указатель на локальную переменную после того, как что-либо удерживает переменную на одну область выше, без необходимости какой-либо подготовки к вызову функции, когда я ее вызываю (создание переменной для ее использования. для вывода вместо того, чтобы просто присвоить вывод чему-либо.