правильный способ сделать это:
void func(struct MyStruct* by_ref);
int main()
{
struct MyStruct ms;
func(&ms);
}
Это не будет загружать напыщенную структуру в стек, и при этом у вас не возникнет проблем со статическими переменными.Возвращать указатель на статическую переменную очень плохо по следующим причинам:
- Это нарушает приватную инкапсуляцию.Очень плохой дизайн программы.
- Многопоточная программа, которая делает это, становится уязвимой.
- Чистые ошибки, как в этом примере:
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”));
}
Вывод функции, печатающей две строки, будет либо «привет, привет», либо «мировым миром» (в зависимости от порядка вычисления параметров функции).