Похоже, в вашем первом примере вы делаете указатель на foo. Тот факт, что вы делаете указатель на foo, не означает, что он на самом деле указывает на объект. Вы должны использовать новый для создания этого объекта. Попробуйте это:
void fn()
{
struct Foo{
string name;
};
Foo* foo = new Foo;
foo->name="sleiman";
cout<<foo->name<<endl;
delete foo;
}
Убедитесь, что вы удалили его, когда закончили его использовать.