Проблема C: передача переменной, определенной в стеке функций - PullRequest
0 голосов
/ 21 января 2011
int myfunc2(struct MyStruct st2[])
{ 

   return 0;

}

int myfunc() 
{
   struct MyStruct st;
   myfunc2(&st);
   return 0;
}

Это чистый баг? Или это не ошибка, если она не вызывала другую функцию и st не передается другой функции в myfunc2. Может ли st быть тем же, на который ссылается myfunc2, когда myfunc2 получает указатель и передает его другой функции?

Ответы [ 5 ]

3 голосов
/ 21 января 2011

Это совершенно правильный код. Вы можете передать его любому количеству функций из myfunc2. Переменная, размещенная в стеке, будет оставаться действительной до тех пор, пока она не выйдет из области видимости myfunc

1 голос
/ 21 января 2011

Это зависит от того, определен ли MyStruct в области видимости для myfunc2 () или нет, и какой параметр myfunc2 () ожидает.

Edit: при вашем редактировании для включения прототипа функции это, безусловно,совершенно правильный код.

0 голосов
/ 21 января 2011

Передача адреса локальной переменной вместо массива вполне подходит и эквивалентна передаче массива размером 1.

Однако проблема с вашим кодом состоит в том, что myfunc2 () не имеет возможностизная размер массива, переданного ему.Я думаю, это нормально, если он использует только первый элемент массива, но тогда он, вероятно, должен быть объявлен для принятия указателя, а не массива.

0 голосов
/ 21 января 2011

Код, который вы показали, действителен, если вы правильно использовали myfunc2. Вы должны сообщить нам семантику (или показать реализацию) myfunc2, чтобы сообщить нам, если что-то хорошо.

0 голосов
/ 21 января 2011

Нет ничего плохого в передаче адреса локальной переменной в функцию, но помните, что переменная выходит из области видимости (и указатель перестает быть действительным), когда функция, содержащая ее, возвращается.Будьте осторожны, если myfunc2() может сохранить указатель для дальнейшего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...