Вы передаете s
по значению.Значение s
остается неизменным в main после вызова allocate_and_initialize
. Чтобы это исправить, вы должны каким-то образом убедиться, что s
в main указывает на блок памяти, выделенный функцией.Это можно сделать, передав адрес s
в функцию:
// s is now pointer to a pointer to struct.
void allocate_and_initialize(struct _struct **s)
{
*s = calloc(sizeof(struct _struct), 1);
(*s)->str = calloc(sizeof(char), 12);
strcpy((*s)->str, "hello world");
}
int main(void)
{
struct _struct *s = NULL; // good practice to make it null ptr.
allocate_and_initialize(&s); // pass address of s.
printf("%s\n", s->str);
return 0;
}
В качестве альтернативы вы можете вернуть адрес блока, выделенного в функции, обратно и назначить его для s
в основном, как было предложенов другом ответе.