Я согласен с ответом Перри. Постоянная строка размещается в разделе данных только для чтения, а не в стеке. В foo () вы возвращаете постоянную строку, к ней можно безопасно обращаться из любого места.
Прежде всего, вы набрали код вручную. Вы не скомпилировали это. У вас в основном есть такой код:
SetFoo(&staticfoo);
printf("%s",staticFoo.C);
Вы видите, что оба объекта staticfoo и staticFoo не одинаковы. Если вы исправите это и запустите программу, вы должны напечатать строку. Это напечатано в моем случае.