Вероятно, это связано с последней вещью в стеке. Без puts()
последним в стеке является выделенный вами узел, и он возвращается. При puts()
последним в стеке является возвращаемое значение puts()
, которое является int
, и возвращается и используется в качестве указателя, что, вероятно, неправильно.
Обратите внимание, что в любом случае ваша программа неверна. Это неопределенное поведение (или какое-то страшно звучащее стандартное поведение), и на него нельзя полагаться. Сделайте так, чтобы ваша функция работала правильно все время - не полагайтесь на неопределенное поведение.
Если вы хотите узнать, правда ли это, вы можете сделать это:
Node * makeNode()
{
Node * newNode;
puts( "I DIDN'T RETURN ANYTHING!!" ) ;
newNode = (Node*)malloc( sizeof(Node) ) ;
}
Вероятно, будет работать так же, как тот, который не puts()
. Это также вероятно будет работать:
Node * makeNode()
{
malloc( sizeof(Node) ) ;
}
Но вы действительно не должны использовать любой из них. Они работают по случайности, и если бы вам действительно повезло, ни один из них не сработал бы.
Также обратите внимание, что некоторые люди (включая меня) считают неправильное приведение типов возвращаемого значения malloc()
, но это спорный вопрос.