Перейти к содержанию
    

нехитрый вопрос по С

Пардон, что простой вопрос.

Разбираюсь с програмой, в которой много конструкций вида :

 

void func1 ()

{

uchar LocalArr[5];

 

. // load data to LocalArr

.

func2 (LocalArr);

.

.

}

/*========================

do smth with array

-------------------------*/

void func2 (uchar *ptr)

{

.

.

}

//-------------------------

 

Может кто-то объяснить, насколько законно передавать во вложенные функции указатель на локальную переменную. В массив грузятся данные каждый раз по новому, глобально хранить их не надо.

Пишу в IAR для AVR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где вы в С нашли вложенные функции?

Передавать в функции указатель на локальные переменные вполне допустимо. Нежелательно возвращать указатель на локальные переменные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, законно. А в ИАРе вложенные функци есть что-ли ? (в GCC точно есть). Вероятно, автор чо-то путает или неясно выражает, но в приведённом коде нет ничего, напоминающего вложенные функции.

Изменено пользователем forever failure

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нежелательно возвращать указатель на локальные переменные.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В GCC есть вложенные функции?

Т.е. можно написать:

int f()
{
   int a = 10;
   int f2()
   {
     return a + 2;
   }
   return f2();
}

А не могли бы вы дать ссылку на описание этого? И как интересно он разруливает локальные области видимости внутри функции...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, я неясно выразился - имел ввиду вызов из функции другой функции.

Спасибо за ответ, просто читал хелп ИАРа, засомневался - вдруг последствия могут появиться при оптимизации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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.

 

:(

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И передавать, и возвращать указатели на локальные переменные, и сами переменные никто не запрещает, главное, чтобы интерфейс функции был соблюден. Ограничения в основном накладываются на вызов функций, которые выполняют запуск асинхронных операций - здесь следует соблюдать внимание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...возвращать указатели на локальные переменные ... никто не запрещает

В общем случае категорически неверно так поступать. Язык вообще не запрещает писать неверные программы :)

, главное, чтобы интерфейс функции был соблюден.

Что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сам язык не запрещает конструкции типа:

int * func (int i)

{

int l = i, * p = &l;

return p;

}

 

Однако, писать так - ССЗБ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...