Я всегда находил рисунки, помогающие понять указатели. Используйте поля для адресов памяти, а метка для поля - это имя переменной. Если переменная является указателем, то содержимое поля является адресом другого поля (нарисуйте линию к другому полю).
Вы используете указатели, когда вам это не нужно. Ваша функция «deletefile1_svc» вообще не манипулирует значением «argp», поэтому ей не нужен указатель на указатель. Кроме того, ваш «результат» не нужно возвращать в качестве указателя, поскольку это просто числовое значение. Вы также не инициализируете результат (он может быть нулевым) или повторно инициализируете его (он статический, поэтому он запомнит последнее присвоенное ему значение).
int
deletefile_1_svc(const char *argp, struct svc_req *rqstp)
{
int result = 0; /* Initial value => failure */
if (remove (argp) == 0)
{
result = 1; /* 1 => success */
}
return result;
}
Для вызова функции используйте:
result_5 = deletefile1_svc(filename, clnt);
if (result_5 == 0)
// Failed
else
// Success
Это сделает код более простым и менее подверженным ошибкам.