Вернуть структуру из функции, содержащей статический массив в C - PullRequest
1 голос
/ 28 января 2011
struct MyStruct
{
  int i; 
  double arr[10];

};


struct MyStruct func()
{


};

При возврате из функции будет полностью скопирована в локальную переменную?

struct Mystruct ms = func();

Ответы [ 4 ]

5 голосов
/ 28 января 2011

Да, можно, структура будет полностью скопирована.

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

правильный способ сделать это:

void func(struct MyStruct* by_ref);

int main()
    {
      struct MyStruct ms;
      func(&ms);
    }

Это не будет загружать напыщенную структуру в стек, и при этом у вас не возникнет проблем со статическими переменными.Возвращать указатель на статическую переменную очень плохо по следующим причинам:

  1. Это нарушает приватную инкапсуляцию.Очень плохой дизайн программы.
  2. Многопоточная программа, которая делает это, становится уязвимой.
  3. Чистые ошибки, как в этом примере:
static uint8 static_str[6];

uint8* func(const uint8 str[6])
{
  uint8 i;

  for(i=0; i<6; i++)
  {
    static_str[i] = str[i];
  }

  return static_str;
}

int main()
{
  print_strings(func(“hello”), func(“world”));
}

Вывод функции, печатающей две строки, будет либо «привет, привет», либо «мировым миром» (в зависимости от порядка вычисления параметров функции).

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

У вас нет возвращаемого значения, поэтому в любом случае вам нужно установить его. Кроме того, лучше использовать указатель:

struct MyStruct* func()
{
     struct MyStruct *pMyStruct=calloc(1,sizeof(struct MyStruct));

     /* fill struct */


     return pMyStruct; 
};
0 голосов
/ 28 января 2011

Да, если func() возвращает переменную типа Mystruct.

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