Возврат указателя на структуру - PullRequest
1 голос
/ 08 января 2012

Я натолкнулся на пример, возвращающий структуру в 'Языке программирования C' Кернигана и Ричи.

/* binsearch: find word in tab[0]...tab[n-1] */
struct key *binsearch(char *word, struct key *tab, int n)
{
    int cond;
    struct key *low = &tab[0];
    struct key *high = &tab[n];
    struct key *mid;

    while (low < high) {
        mid = low + (high-low) / 2;
        if ((cond = strcmp(word, mid->word)) < 0)
            high = mid;
        else if (cond > 0)
            low = mid + 1;
        else
            return mid;
    }

    return NULL;
}

Кажется, что функция возвращает указатель на локальную переменную в функции;разве это не было бы случаем возврата свисающего указателя?

Ответы [ 3 ]

7 голосов
/ 08 января 2012

Нет, эта функция не возвращает указатель на локальную переменную. На самом деле в этой функции вообще нет локальных переменных типа struct key.

Эта функция возвращает указатель на один из элементов struct key из массива tab, предоставленного этой функции ее вызывающей стороной.

1 голос
/ 08 января 2012

Я думаю, что вы имеете в виду код binsearch, указанный в page #137.Чтобы лучше понять код, вам необходимо прочитать объяснение, приведенное в page #138.

@K&R

@The C Programming Language

@Second Edition

1 голос
/ 08 января 2012

Не в этом случае, поскольку локальными являются только указатели, а не сами структуры, поскольку они передаются извне в аргументе tab.

...