Я не совсем уверен в этом, но вот что я понимаю из чтения
EXP35-C. Не изменяйте объекты с временным временем жизни несколько раз. Это не очень хороший language-lawyer
ответ, но я попытаюсь объяснить его в более простых терминах.
Обычно функция C не может вернуть массив. Тем не менее, вы (пытаетесь) обойти это, прикрепив массив в структуре и вернув его. Рассмотрим пример кода:
#include <stdio.h>
struct X { char a[8]; };
struct X salutation(void) {
struct X result = { "Hello" };
return result;
}
struct X addressee(void) {
struct X result = { "world" };
return result;
}
int main(void) {
printf("%s, %s!\n", salutation().a, addressee().a);
return 0;
}
В C99 эта программа вызывала неопределенное поведение. Вы не можете даже получить доступ к массиву внутри структуры. Причина в том, что время жизни массива заканчивается, когда функция с локальной переменной возвращается.
В C11 они немного ослабили правила, поэтому вам разрешен доступ к массиву, но вы не можете изменять его.
Из-за этой тонкой разницы правило EXP35-C
также рекомендует не делать этого. Вместо этого сохраните результат, содержащий массив, в локальную переменную:
#include <stdio.h>
struct X { char a[8]; };
struct X salutation(void) {
struct X result = { "Hello" };
return result;
}
struct X addressee(void) {
struct X result = { "world" };
return result;
}
int main(void) {
struct X my_salutation = salutation();
struct X my_addressee = addressee();
printf("%s, %s!\n", my_salutation.a, my_addressee.a);
return 0;
}