返回C中的指针

返回C中的指针,c,pointers,return,structure,C,Pointers,Return,Structure,这是我第一次在这里问。 我只是想知道这段代码的“返回”是否正确,特别是第一个 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];

这是我第一次在这里问。 我只是想知道这段代码的“返回”是否正确,特别是第一个

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;
}

从这一行代码:

    if(table->data[i]->mediaID == id) return *table->data[i];
这表明
table->data[i]
应该是指向具有
mediaID
成员的结构的指针。但是,
return
语句正在取消对该指针的引用,这意味着它将返回一个结构对象,而不是指向结构的指针。基于此,我认为您不应该将该值解引用到
返回值中:

    if(table->data[i]->mediaID == id) return table->data[i];
但是,您的
tTblVideo
typedef
显示
data
成员是指向
tVideo
的指针。您的函数无法编译。最小的修正是使用正确的结构成员访问操作符,并返回找到的元素的地址

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

从这一行代码:

    if(table->data[i]->mediaID == id) return *table->data[i];
这表明
table->data[i]
应该是指向具有
mediaID
成员的结构的指针。但是,
return
语句正在取消对该指针的引用,这意味着它将返回一个结构对象,而不是指向结构的指针。基于此,我认为您不应该将该值解引用到
返回值中:

    if(table->data[i]->mediaID == id) return table->data[i];
但是,您的
tTblVideo
typedef
显示
data
成员是指向
tVideo
的指针。您的函数无法编译。最小的修正是使用正确的结构成员访问操作符,并返回找到的元素的地址

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

table->data
属于
tVideo*
类型,因此
table->data[i]
属于
tVideo
类型。要返回指向数组项的指针,需要获取该项的地址:

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

table->data
属于
tVideo*
类型,因此
table->data[i]
属于
tVideo
类型。要返回指向数组项的指针,需要获取该项的地址:

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

不看
tTblVideo
就无法知道。它是否编译?第二个返回值总是给出
NULL
,因为从未找到任何设置。也就是说,提前退出是一条路,所以这不是一个真正的问题;这只是一个不必要的变量。@AndrejsCainikovs如果循环很长,那么这可能会非常昂贵,如果存在多个事件,还可能会将语义从“返回第一个”更改为“返回最后一个”。换句话说,我完全不同意。提前返回非常棒。@Étienne-返回null而不是指针是很好的惯用C语言。请看
malloc
。返回-1是等待发生的事故。替换
return videoFound
返回空值我会很高兴的。在这样一个非常简单的函数中,从循环中提前返回是完全可以的。如果不看到
tTblVideo
,就无法知道。它是否编译?第二个返回值总是给出
NULL
,因为从未找到任何设置。也就是说,提前退出是一条路,所以这不是一个真正的问题;这只是一个不必要的变量。@AndrejsCainikovs如果循环很长,那么这可能会非常昂贵,如果存在多个事件,还可能会将语义从“返回第一个”更改为“返回最后一个”。换句话说,我完全不同意。提前返回非常棒。@Étienne-返回null而不是指针是很好的惯用C语言。请看
malloc
。返回-1是等待发生的事故。替换
return videoFound
返回空值我会很高兴的。在这样一个非常简单的函数中,从循环中提前返回是完全正确的。我已经添加了tTblVideo的定义,正如您所看到的,数据也是一个指针,所以在本例中它是对的?您是对的。我已经添加了tTblVideo的定义,正如您所看到的,数据也是一个指针,所以在本例中它是正确的?不完全正确。还需要
表->数据[i]。mediaID==id
。不完全需要。还需要
表->数据[i]。mediaID==id