在b参数中返回指向此新结构的指针?

如何解决在b参数中返回指向此新结构的指针?

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

“返回”值,函数返回void。

不相关,但我也收到错误消息

'* b'是一个指针;您是要使用'->'吗?对于* b-> year = y;

这使我感到困惑,因为我确实写了一个箭头。有谁知道为什么我仍然出现此错误

Book.c

void initBook(char *t,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;

解决方法

您有两种选择:

  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是在函数外部完成的(因此您也将记住在其中进行自由操作)。

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

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

我为title变量添加了一个malloc(马丁·詹姆斯(Martin James)评论说,它尚未初始化)。但是,我建议结构定义中的title变量应具有一些固定的最大长度(除非对于您的应用程序是不可能的,否则您实际上必须允许其为任何长度,在这种情况下,您将拥有记得以后再释放它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?