首页 > 解决方案 > 在 b 参数中返回一个指向这个新结构的指针?

问题描述

我正在尝试实现一个 void initBook(char *t, int y, BookType **b)动态分配新BookType结构的函数,将新结构的字段初始化为在tandy参数中找到的值,并在参数中返回指向这个新结构的指针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;
}

定义文件

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

标签: cpointersstructdynamicreturn

解决方案


你有两个选择:

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

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

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

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

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


推荐阅读