Показать сообщение отдельно

  #9  
Старый 01.02.2009, 19:29
xismyname
Познающий
Регистрация: 07.09.2008
Сообщений: 79
С нами: 9302336

Репутация: 10
По умолчанию

Надо же,столько ответов,и ни один не ответил на вопрос "Как вернуть структуру из функции ?"

Как уже отмечалось,все локальные переменные распологаються в stack-e,после выполнении данной функции они удаляються/перезаписываються - поэтому придеться создать указатель на функцию и динамически занять место в памяти.

Пример :
Код:
#include <stdio.h>

/* Наша структура */
struct{
    unsigned char name[16];
    unsigned int  age;
}MyStruct;



/* функция которая возвращает указатель на структуру MyStruct */
struct MyStruct *MyFunc(void)
{
   /* Создаем указатель и аллокируем место в памяти */
   struct MyStruct *r_struct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
   
   /* Если аллокация памяти прошла успешно - заполняем структуру и
      возвращаем указатель на данную структуру,в другом случаи
      возвращаем NULL.
   */
   if( r_struct != NULL )
   {
       r_struct->name[] = "MyName";
       r_struct->age    = 17;
       return r_struct;
   }
   else
   {
       return NULL;
   }
}
   


int main(void)
{
    /* Тут мы уже создаем только указатель на структуру,аллокировать
       память нам не приходиться так,как, она уже аллокирована 
       функцией MyFunc() и будет доступно нам до конца программы,
       пока не освободим ее с помощью функции free() 
    */
     
    struct MyStruct *r_getStruct = MyFunc();
    
    if( r_getStruct != NULL )
    {
        printf("Name : %s\n", r_getStruct->name);
        printf("Age  : %d\n", r_getStruct->age);
        free((void*)r_getStruct);
        return 0;
    }
    else
    {
        return -1;
    }
}
Чтобы все время не писать перед идентификатором структуры struct лучше создать как новый тип т.е. с помощью typedef .
 
Ответить с цитированием