Передача указателя на указатель на символ в функцию - PullRequest
2 голосов
/ 03 июня 2009

C99

Я использую указатель на указатель и передаю его в функцию для отображения имен.

Тем не менее, когда я иду через отладчик. Указатель на указатель в параметре указывает на ничто. Тем не менее, я использую его для отображения всех имен в основном.

Если бы я передавал целое число, целочисленное значение все равно было бы там. Почему не указатель на указатель?

Это как-то связано с областью действия или мне нужно выделить память, используя malloc или calloc для указателя на указатель?

Большое спасибо за любые предложения,

#include <stdio.h>

void display_names(char **first_names);

int main(void)
{
    char *names[] = {"peter", "Mary", "John", 0};
    char **print_names = names;

    while(*print_names)
    {
        printf("Name: %s\n", *print_names);
        *print_names++;
    }

    display_names(print_names);

    getchar();

    return 0;
}

void display_names(char **first_names)
{
    while(*first_names)
    {
        printf("First name: %s\n", *first_names);
        first_names++;
    }
}

Ответы [ 2 ]

6 голосов
/ 03 июня 2009

В вашем цикле while вы зацикливаетесь, пока print_names не укажет на ничто, а затем передаете его на display_names. С этой точки зрения, * print_names == 0. Вместо цикла while попробуйте:

char **print_names = names;
while(*print_names)
{
        printf("Name: %s\n", *print_names);
        *print_names++;
}
print_names = names;
display_names(print_names);

Это должно вывести имена дважды - один раз из цикла while и один раз из вызова функции.

0 голосов
/ 07 марта 2013
char *names[] = {"peter", "Mary", "John", 0};
char **print_names;

int main(void)
{        
    print_names = &names[0]; // point to peter
    while(*print_names)
        printf("Name: %s\n", *(print_names++));  // last address in here is John

    print_names = &names[0];  // reset point to peter before call display_names
    display_names(print_names+0);   // peter
    display_names(print_names+1);   // Mary
    display_names(print_names+2);   // John

    getchar();
    return 0;
}

void display_names(char **names_selected)
{
     printf("Name: %s\n", *names_selected);    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...