Так как другие объяснили как до go о решении проблемы, я немного расширю другие ответы и объясню почему у вас возникла проблема в первую очередь.
Проще говоря, всякий раз, когда вызывается функция, ей присваивается кадр стека (также называемый запись активации ). То есть: ему дается область памяти, в которую он может поместить свои локальные переменные. Когда функция возвращается, кадр стека уничтожается. Если затем вызвать другую функцию, кадр стека этой функции перезаписывает кадр стека предыдущей функции.
В этом конкретном c случае, когда getstring
возвращает и printstring
, а затем printf
кадры стека последних двух вместе с кадром main
перезаписывают данные, которые ранее находились в кадре стека getstring
. Наиболее вероятным результатом является то, что printf
выведет полный мусор. В худшем случае, это может сделать всю программу cra sh, если нулевой терминатор строки был перезаписан.
Интересно также отметить, что в вашем случае кажется, что двоичное значение, соответствующее этому из нулевого терминатора \0
был вставлен куда-то, потому что перед возвращением printf
печатается только немного мусора. Это будет означать, что он не остановился на исходном нулевом терминаторе массива символов x
, а скорее обнаружил значение, которое он интерпретировал как нулевой терминатор и возвратил.
Если вы используете sh, вы можете прочитать подробнее о стеке вызовов в Википедии .