2013-05-30 3 views
2

Это первый раз, когда я спрашиваю здесь. Я просто хотел знать, правильны ли «возврат» этого блока кода, особенно первый.Возврат указателя в C

tVideo* getVideo(int id, tTblVideo* table){ 
    tVideo* videoFound = NULL; 
    int i; 
    for(i = 0; i < table->length; i++){ 
     if(table->data[i]->mediaID == id) return *table->data[i]; 
    } 
    return videoFound; 
} 

EDIT: Добавление определения tTblVideo:

typedef struct { 
    /* Number of stored files */ 
    int length; 

    /* Array of video files */ 
    tVideo *data; 

} tTblVideo; 
+2

никакого способа узнать, не видя 'tTblVideo'. Скомпилирует ли он? – jxh

+3

Второе возвращение всегда дает 'NULL', потому что ничего никогда не устанавливает videoFound. Тем не менее, ранний выход - это путь, так что это не настоящая проблема; это просто лишняя переменная. – ams

+0

Хорошей практикой было бы заменить 'return * table-> data [i]' на 'videoFound = table-> data [i]'. –

ответ

3

Из этой строки кода:

if(table->data[i]->mediaID == id) return *table->data[i]; 

Это показывает, что table->data[i] как ожидается, будет указатель на структуру с mediaID члена , Однако оператор return разыменовывает этот указатель, то есть он возвращает объект структуры, а не указатель на структуру. Исходя из этого, я бы сказал, вы не должны разыменования значения к return:

if(table->data[i]->mediaID == id) return table->data[i]; 

Однако ваш typedef для tTblVideo показывает, что data элемент является указателем на tVideo. Ваша функция не будет компилироваться. Минимальные исправления будут заключаться в использовании оператора доступа к правому члену структуры и возврате адреса найденного элемента.

if(table->data[i].mediaID == id) return &table->data[i]; 
+0

Вы правы. Я добавил определение tTblVideo, и, как вы можете видеть, данные также являются указателями, так что в этом случае было бы правильно? – tomacco

+0

Это в обратном направлении! – ams

+0

@ams: Что ты имеешь в виду? – jxh

1

table->data имеет тип tVideo*, поэтому table->data[i] имеет тип tVideo. Для того, чтобы вернуть указатель на элемент массива вы должны взять адрес этой записи:

if(table->data[i].mediaID == id) return &table->data[i]; 
+0

Не совсем. Также требуется 'table-> data [i] .mediaID == id'. – jxh

+0

@ user315052: отредактирован, спасибо. – ams

Смежные вопросы