Это неправильно на многих уровнях.В foo вы динамически выделяете пространство для строки символов и заполняете ее - это хорошо.
Дело в том, что теперь у вас есть контейнер (ну, блок памяти) для каждой строки, a и b, так какВы назвали Foo на обоих.Вам нужен этот контейнер для хранения строки в течение срока, который вы хотите использовать.
Таким образом, вы не можете звонить бесплатно на a или b, пока не закончите их использовать.Вы вызываете это слишком рано (до вашего printf ()), поэтому вы вызываете неопределенное поведение.Насколько вы знаете, компьютер повторно использовал области памяти для a и b, прежде чем ваш printf даже напечатает их содержимое.Это может привести к возникновению ошибки или к чему-то противному.
Позвоните бесплатно обоим после printf, когда закончите.
Кроме того, установите указатели a и b на NULL, чтобы вы моглизнаю, что они пусты.Всегда проверяйте, чтобы ваши указатели имели значение (не нулевое), прежде чем использовать / разыменовать их), и вы избавите себя от многих проблем.