【问题标题】:Returning a pointer in C在 C 中返回一个指针
【发布时间】:2013-05-25 21:54:59
【问题描述】:

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

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

编辑:添加 tTblVideo 定义:

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

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

} tTblVideo;

【问题讨论】:

  • 没有看到tTblVideo就无法知道。它编译了吗?
  • 第二次返回总是给NULL,因为没有设置videoFound。也就是说,提前退出是要走的路,所以这不是一个真正的问题;这只是一个不必要的变量。
  • @AndrejsCainikovs 如果循环很长,这可能会非常昂贵,并且如果有多次出现,也可能将语义从“返回第一个”更改为“返回最后一个”。换句话说,我完全不同意。早日回归很棒。
  • @Étienne - 返回 null 而不是指针是很好的惯用 C。看看malloc。返回 -1 是等待发生的意外。
  • return NULL; 替换return videoFound;,我会很高兴的。在这样一个非常简单的函数中,从循环中提前返回是完全可以的。

标签: c pointers return structure


【解决方案1】:

从这行代码:

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

这表明table-&gt;data[i] 应该是指向具有mediaID 成员的结构的指针。但是,return 语句正在取消引用这个指针,这意味着它将返回一个结构对象,而不是指向结构的指针。基于此,我会说你不应该取消引用 return 的值:

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

但是,tTblVideotypedef 表明 data 成员是指向 tVideo 的指针。您的函数无法编译。最小的修正是使用正确的结构成员访问运算符,并返回找到的元素的地址。

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

【讨论】:

  • 你是对的。我已经添加了tTblVideo的定义,你可以看到data也是一个指针,那么在这种情况下是对的吗?
【解决方案2】:

table-&gt;datatVideo* 类型,所以 table-&gt;data[i]tVideo 类型。要返回指向数组条目的指针,您需要获取该条目的地址

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

【讨论】:

  • 不完全。还需要table-&gt;data[i].mediaID == id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
相关资源
最近更新 更多