getcwd()
выделяет буфер для path
размера, равного size
. Вы не инициализировали переменную size
. Установите его достаточно большим, чтобы вместить весь путь и имя, и это должно работать. Если буфер недостаточно велик, strcat()
будет записывать после конца буфера, перезаписывая другие значения в стеке (возможно, включая указатель возврата функции, что приведет к ошибке segfault на return
).
Кроме того, getcwd()
использует malloc()
для выделения буфера, который вы назначаете для path
. Было бы неплохо free()
этот буфер, когда вы закончите с ним. Хотя это не является строго необходимым в конце программы - поскольку система все равно будет восстанавливать память.
В вашем коде также есть некоторые логические ошибки. Во-первых, индексы массива argv
находятся в диапазоне от 0 до argc
-1. Ваше условие выхода из цикла for
заставляет вас читать один элемент после конца массива argv
.
Обратите внимание, что strcat()
будет добавлять новый параметр на каждой итерации к результату предыдущей итерации . Это означает, что вызов /home$ ./output foo bar baz
закончится:
The complete path of the file name is = /home/foo
The complete path of the file name is = /home/foobar
The complete path of the file name is = /home/foobarbaz
Что, вероятно, не то, что вы хотите :). (опущены нерелевантные строки вывода).