Функция не создает строку, потому что результирующий массив не содержит завершающий ноль, хотя место для него было зарезервировано, когда массив был выделен.
char * deco = malloc(21);
Поэтому вам необходимо добавить массив с завершающий ноль перед выходом из функции
//...
*(deco + p ) = '\0';
return deco;
}
В противном случае это do-while l oop
do{
c = *(lineDOWN+k);
printf("%c",*(lineDOWN+k));
k++;
}while(c != '\0')
будет иметь неопределенное поведение.
Но даже если вы будете добавьте массив с завершающим нулем, l oop будет неверно считать длину сохраненной строки, потому что это увеличит переменную k, даже если текущий символ является конечным нулем.
Вместо этого вы должны использовать некоторое время l oop. В этом случае объявление переменной c
будет избыточным. L oop может выглядеть как
while ( *( lineDOWN + k ) )
{
printf("%c",*(lineDOWN+k));
k++;
}
В этом случае этот вызов
printf("\nLENGTH %d\n\n",k);
^^
выведет правильную длину строки, равную 20
.
И перед выходом из программы вы должны освободить выделенную память не требуется, если вы не собираетесь использовать элементы массива в качестве строк и не используете их в качестве строк в своей программе.
Учтите, что ваша программа полна магических чисел c. Такая программа обычно подвержена ошибкам. Вместо этого вы должны использовать именованные константы.