如何解决在b参数中返回指向此新结构的指针?
我正在尝试实现一个void initBook(char *t,int y,BookType **b)
函数,该函数动态分配新的BookType
结构,将新结构的字段初始化为t
和y
中的值参数,并在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;
解决方法
您有两种选择:
- 您只需在进行操作时为* 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;
}
- 不要将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 举报,一经查实,本站将立刻删除。