Возврат структуры из функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Допустим, есть следующий код, работающий успешно.
typedef struct
{
    int a;
    int b;
} myStruct;
 
myStruct* simplefunc(int a, int b)
{
    myStruct *ms_p;
    myStruct Ms;
 
    Ms.a = a;
    Ms.b = b;
    ms_p= &Ms;
 
    return ms_p;
}
 
int main(int argc, char** argv) {   
 
        myStruct *ms_p = NULL;
    ms_p = simplefunc(3, 5);
    printf("a: %d b: %d\n", ms_p->a, ms_p->b);
    return 0;
}
Помогите разобраться. В функции мы создаем структуру, область видимости которой ограничивается этой функцией. Из нее мы возвращаем указатель на эту структуру. Мне думалось, что подобное работать не должно. Т.к. объявленная структура при выходе за области действия функции перестает существовать, и, в таком случае, возвращаемый указатель должен ссылаться на какой-то мусор. Т.е. получается, область памяти остается без изменений, мы просто не можем обращаться к структуре вне функции по имени? Может ли быть такое, что эта область памяти изменится каким-либо другим образом? Структура хранится в стеке же?

Решение задачи: «Возврат структуры из функции»

textual
Листинг программы
#include <stdio.h>
 
 
typedef struct
{
    int a;
    int b;
} myStruct;
 
myStruct* simplefunc(int a, int b)
{
    static myStruct Ms;
 
    Ms.a = a;
    Ms.b = b;
    return &Ms;
}
 
int main(int argc, char** argv) {   
 
    myStruct *ms_p = simplefunc(3, 5);
    printf("a: %d b: %d\n", ms_p->a, ms_p->b);
    return 0;
}

Объяснение кода листинга программы

  1. Включаем заголовочный файл stdio.h для использования функций вывода
  2. Создаем структуру myStruct с полями типа int a и int b
  3. Создаем функцию simplefunc, которая возвращает указатель на структуру myStruct
  4. В функции simplefunc инициализируем поля структуры Ms значениями аргументов функции a и b
  5. Возвращаем адрес структуры Ms
  6. В функции main создаем указатель на структуру myStruct ms_p и присваиваем ему результат вызова функции simplefunc с аргументами 3 и 5
  7. Выводим значения полей структуры через указатель ms_p на экран
  8. Возвращаем 0, чтобы указать, что программа успешно завершилась

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы