vitko 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Пардон, что простой вопрос. Разбираюсь с програмой, в которой много конструкций вида : void func1 () { uchar LocalArr[5]; . // load data to LocalArr . func2 (LocalArr); . . } /*======================== do smth with array -------------------------*/ void func2 (uchar *ptr) { . . } //------------------------- Может кто-то объяснить, насколько законно передавать во вложенные функции указатель на локальную переменную. В массив грузятся данные каждый раз по новому, глобально хранить их не надо. Пишу в IAR для AVR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба А где вы в С нашли вложенные функции? Передавать в функции указатель на локальные переменные вполне допустимо. Нежелательно возвращать указатель на локальные переменные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба Да, законно. А в ИАРе вложенные функци есть что-ли ? (в GCC точно есть). Вероятно, автор чо-то путает или неясно выражает, но в приведённом коде нет ничего, напоминающего вложенные функции. Изменено 28 января, 2008 пользователем forever failure Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Нежелательно возвращать указатель на локальные переменные. "Нежелательно" это не то слово, которое может характеризовать возвращение указателя на место в стеке в котором когда-то действительно была локальная переменная :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба В GCC есть вложенные функции? Т.е. можно написать: int f() { int a = 10; int f2() { return a + 2; } return f2(); } А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vitko 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Да, я неясно выразился - имел ввиду вызов из функции другой функции. Спасибо за ответ, просто читал хелп ИАРа, засомневался - вдруг последствия могут появиться при оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 28 января, 2008 Опубликовано 28 января, 2008 (изменено) · Жалоба В GCC есть вложенные функции? .... А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции... GCC Internals Manual 15.2 Trampolines for Nested Functions: http://gcc.gnu.org/onlinedocs/gccint/Tramp...tml#Trampolines A 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. :( Анатолий. Изменено 28 января, 2008 пользователем aesok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 28 января, 2008 Опубликовано 28 января, 2008 · Жалоба Спасибо, не знал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
a_electronic 0 29 января, 2008 Опубликовано 29 января, 2008 · Жалоба И передавать, и возвращать указатели на локальные переменные, и сами переменные никто не запрещает, главное, чтобы интерфейс функции был соблюден. Ограничения в основном накладываются на вызов функций, которые выполняют запуск асинхронных операций - здесь следует соблюдать внимание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 29 января, 2008 Опубликовано 29 января, 2008 · Жалоба ...возвращать указатели на локальные переменные ... никто не запрещает В общем случае категорически неверно так поступать. Язык вообще не запрещает писать неверные программы :) , главное, чтобы интерфейс функции был соблюден. Что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 29 января, 2008 Опубликовано 29 января, 2008 · Жалоба сам язык не запрещает конструкции типа: int * func (int i) { int l = i, * p = &l; return p; } Однако, писать так - ССЗБ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться