c - 在 b 参数中返回一个指向这个新结构的指针?
问题描述
我正在尝试实现一个 void initBook(char *t, int y, BookType **b)
动态分配新BookType
结构的函数,将新结构的字段初始化为在t
andy
参数中找到的值,并在参数中返回指向这个新结构的指针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;
解决方案
你有两个选择:
- 您只需按照您的操作设置 *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 是在函数之外完成的(因此您也会记得在那里进行 free 操作)。
此外,在第一种形式中,C 约定是将返回的参数放在左侧,类似于赋值。
第二种形式更像是一个“工厂”。函数 malloc 并初始化对象(尽管代码没有为 设置值id
)。但是你仍然需要在完成后释放指针。
我为title
变量添加了一个 malloc(根据 Martin James 的评论,它是未初始化的)。但是,我建议title
结构定义中的变量具有一些固定的最大长度(除非您的应用程序不可能,否则您必须允许它为任意长度,在这种情况下您必须记住释放它之后)。
推荐阅读
- mysql - 错误:bean 名称“buildingID”的 BindingResult 和普通目标对象都不能用作请求属性
- javascript - THREEjs 旋转星域
- c - 如何使用 C 中的文件进行此操作?
- java - NVIDIA Visual Profiler 在启动时崩溃
- javascript - 移除数组中的 K 个连续元素后求最小振幅
- node.js - NPM 安装错误
- python - 如何使用循环创建具有多个键值对的嵌套字典的字典?
- node.js - Next JS : 错误: EPERM: operation not allowed, rmdir
- python - 对模拟对象的任何调用都有相同的响应
- python - 有没有办法以标准方式编写 websocket 代码?