Полная версия этой страницы:
нехитрый вопрос по С
Пардон, что простой вопрос.
Разбираюсь с програмой, в которой много конструкций вида :
void func1 ()
{
uchar LocalArr[5];
. // load data to LocalArr
.
func2 (LocalArr);
.
.
}
/*========================
do smth with array
-------------------------*/
void func2 (uchar *ptr)
{
.
.
}
//-------------------------
Может кто-то объяснить, насколько законно передавать во вложенные функции указатель на локальную переменную. В массив грузятся данные каждый раз по новому, глобально хранить их не надо.
Пишу в IAR для AVR.
Непомнящий Евгений
Jan 28 2008, 11:27
А где вы в С нашли вложенные функции?
Передавать в функции указатель на локальные переменные вполне допустимо. Нежелательно возвращать указатель на локальные переменные.
forever failure
Jan 28 2008, 11:31
Да, законно. А в ИАРе вложенные функци есть что-ли ? (в GCC точно есть). Вероятно, автор чо-то путает или неясно выражает, но в приведённом коде нет ничего, напоминающего вложенные функции.
zltigo
Jan 28 2008, 11:35
Цитата(Непомнящий Евгений @ Jan 28 2008, 14:27)

Нежелательно возвращать указатель на локальные переменные.
"Нежелательно" это не то слово, которое может характеризовать возвращение указателя на место в стеке в котором когда-то действительно была локальная переменная

.
Непомнящий Евгений
Jan 28 2008, 11:57
В GCC есть вложенные функции?
Т.е. можно написать:
Код
int f()
{
int a = 10;
int f2()
{
return a + 2;
}
return f2();
}
А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...
Да, я неясно выразился - имел ввиду вызов из функции другой функции.
Спасибо за ответ, просто читал хелп ИАРа, засомневался - вдруг последствия могут появиться при оптимизации.
Цитата(Непомнящий Евгений @ Jan 28 2008, 14:57)

В GCC есть вложенные функции?
....
А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...
GCC Internals Manual
15.2 Trampolines for Nested Functions:
http://gcc.gnu.org/onlinedocs/gccint/Tramp...tml#TrampolinesA trampoline is a
small piece of code that is
created at run time when the address of a nested function is taken. It normally
resides on the stack, in the stack frame of the containing function.
Анатолий.
Непомнящий Евгений
Jan 28 2008, 13:00
Цитата(aesok @ Jan 28 2008, 15:37)

Спасибо, не знал.
oran-be
Jan 29 2008, 10:35
И передавать, и возвращать указатели на локальные переменные, и сами переменные никто не запрещает, главное, чтобы интерфейс функции был соблюден. Ограничения в основном накладываются на вызов функций, которые выполняют запуск асинхронных операций - здесь следует соблюдать внимание.
zltigo
Jan 29 2008, 12:51
Цитата(oran-be @ Jan 29 2008, 13:35)

...возвращать указатели на локальные переменные ... никто не запрещает
В общем случае категорически неверно так поступать. Язык вообще не запрещает писать неверные программы
Цитата
, главное, чтобы интерфейс функции был соблюден.
Что?
forever failure
Jan 29 2008, 13:07
сам язык не запрещает конструкции типа:
int * func (int i)
{
int l = i, * p = &l;
return p;
}
Однако, писать так - ССЗБ.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.