【问题标题】:Return a pointer to this new structure in the b parameter?在 b 参数中返回一个指向这个新结构的指针?
【发布时间】:2021-02-21 00:01:38
【问题描述】:

我正在尝试实现一个void initBook(char *t, int y, BookType **b) 函数,该函数动态分配一个新的BookType 结构,将新结构的字段初始化为在ty 参数中找到的值,并返回一个指向它的指针b 参数中的新结构。我对如何做最后一部分感到困惑,我必须返回一个指针并希望得到一些帮助。我还认为如果函数无效,我无法返回值?当我尝试编译时,我收到警告

'return' 带有一个值,在函数中返回 void。

不相关,但我也得到错误

'*b' 是一个指针;你的意思是使用'->'吗?对于行 *b->year = y;

这让我很困惑,因为我真的写了一个箭头。有谁知道为什么我仍然收到此错误?

书.c

void initBook(char *t, int y, BookType **b){
    *b = malloc(sizeof(BookType));
    strcpy((*b)->title, t);
    *b->year = y;
    return b;
}

defs.h

typedef struct{
    int id;
    char *title; 
    int year;
} BookType;

【问题讨论】:

  • "return" 在这种情况下并不意味着函数的返回值。这只是意味着将值返回给调用者。您已经使用返回参数执行了该操作:*b = malloc(sizeof(BookType));.
  • void 函数没有返回值;完全放弃return 声明。您正确使用(*b)->title 访问标题;您应该使用(*b)->year 来访问年份。您对*b 的赋值设置了其地址传递给函数的变量,有效地“返回”了新值。
  • 您应该在设置标题和年份之前检查*b 不为空。众所周知,内存分配有时会失败。您还应该考虑如何初始化 id 成员;目前,它的内容是不确定的。您也没有将标题复制到其中的有效点指针。我是从Martin Jamescomment 那里找到的。

标签: c pointers struct dynamic return


【解决方案1】:

你有两个选择:

  1. 您只需照常设置 *b 的值,不返回任何内容,
void initBook(char *t, int y, BookType **b) {
    /* Assume BookType was malloc'ed outside of this function. */
    (*b)->title = malloc(strlen(t) + 1);
    strcpy((*b)->title, t);
    (*b)->year = y;
    return;
}
  1. 不要将 b 作为参数传递,而是声明函数以返回指向它的指针:
BookType* initBook(char *t, int y) {
    BookType *b = malloc(sizeof(BookType));
    b->title = malloc(strlen(t) + 1);
    strcpy(b->title, t);
    b->year = y;
    return b;
}

上面有几个cmets。在第一种形式中,您可以根据需要进行 malloc,但通常使用这种方法,假定 malloc 是在函数之外完成的(因此您也会记得在那里进行 free 操作)。

另外,在第一种形式中,C 约定是将返回的参数放在左边,类似于赋值。

第二种形式更像是一个“工厂”。函数 malloc 并初始化对象(尽管代码没有为 id 设置值)。但是你仍然需要在完成后释放指针。

我为title 变量添加了一个malloc(根据Martin James 的评论,它是未初始化的)。但是,我建议结构定义中的 title 变量具有一些固定的最大长度(除非您的应用程序不可能,否则您必须允许它为任意长度,在这种情况下您必须记住稍后释放它)。

【讨论】:

  • 在第一个函数中,(*b)->title*b->year 的使用不一致——两者都需要括号。当然,这也是编译器向 OP 识别的问题,而您只是复制了错误的代码,但是……
  • 'strcpy((*b)->title, t)' - 标题未初始化:(
  • @JonathanLeffler 你是对的。应该在两个地方都有括号。我刚刚复制了提问者的代码。固定。
  • 几行代码可以压缩多少问题,真是令人惊讶!
猜你喜欢
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多