Проблема с вашим текущим кодом состоит в том, что создаваемая вами структура создается в стеке и будет очищена, как только функция вернется.
struct foo
{
int a;
int b;
};
struct foo* create_foo( int a, int b )
{
struct foo* newFoo = (struct foo*)malloc( sizeof( struct foo ) );
if( newFoo )
{
newFoo->a = a;
newFoo->b = b;
}
return newFoo;
}
Это даст вам выделенный объект кучи.Конечно, вам понадобится функция для освобождения этой памяти, или это утечка памяти.
void destroy_foo( struct foo* obj )
{
if( obj )
free( obj );
}
void print_foo( struct foo* obj )
{
if( obj )
{
printf("foo->a = %d\n",obj->a);
printf("foo->b = %d\n",obj->b);
}
}
(кстати, этот стиль поможет вам частично перейти к «объектно-ориентированному» C. Добавьте несколькоуказатели на структуру (чтобы получить полиморфное поведение), и у вас есть кое-что интересное, хотя я бы поспорил с C ++ на этом этапе.)