Указатель на указатель - PullRequest
       4

Указатель на указатель

1 голос
/ 02 декабря 2011

У меня много проблем с этим фрагментом кода (я не очень хорош в указателях: P). Итак, вот код.

printf("\n Enter the file name along with its extensions that you want to delete:-");
                     scanf("%s",fileName);
                                       deletefile_1_arg=fileName;
                                       printf("test\n");
                     result_5 = deletefile_1(&deletefile_1_arg, clnt);
                     if (result_5 == (int *) NULL) {
                        clnt_perror (clnt, "call failed");
                     }
                     else
                     {
                        printf("\n File is deleted sucessfully");
                        goto Menu2;
                     }
                     break;

Вызываемая функция выглядит следующим образом.

int *
deletefile_1_svc(char **argp, struct svc_req *rqstp)
{
static int  result;
    printf("test2\n");
printf("%s",**argp);
if(remove(**argp));
{
    printf("\nFile Has Been Deleted");
    result=1;
}
return &result;
}

Я получаю test2 на консоли, но. Он не печатает значение argp / удаляет этот файл perticular. Я не уверен, что я делаю неправильно. Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

argp - это указатель на указатель на символ, и вы пытаетесь использовать его как указатель на символ, попробуйте изменить код на:

printf("%s", *argp);

Вам также необходимо изменить remove вызов на:

remove(*argp);
0 голосов
/ 02 декабря 2011

Я всегда находил рисунки, помогающие понять указатели. Используйте поля для адресов памяти, а метка для поля - это имя переменной. Если переменная является указателем, то содержимое поля является адресом другого поля (нарисуйте линию к другому полю).

Вы используете указатели, когда вам это не нужно. Ваша функция «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

Это сделает код более простым и менее подверженным ошибкам.

...