| xismyname |
01.02.2009 19:29 |
Надо же,столько ответов,и ни один не ответил на вопрос "Как вернуть структуру из функции ?"
Как уже отмечалось,все локальные переменные распологаються в 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 .
|