我正在为一个学校项目编写代码,我们正在定义一个库,但我无法让函数正确返回
我试图重新定义我的代码并将int init_book更改为int * init_book,但这只会给我其他错误
int init_book(struct book *p_book, const char *p_id, const char *p_title, const char * p_author, struct date p_release) {
p_book = malloc(sizeof(struct book));
for (int i = 0; i < 10; i++) {
p_book->id[i] = p_id[i];
}
p_book->title = malloc(strlen(p_title) * sizeof(char));
p_book->author = malloc(strlen(p_author) * sizeof(char));
p_book->title = p_title;
p_book->author = p_author;
p_book->release_date = p_release;
return p_book;
}
//a part of my main function that initiates the function
if (init_book(&a1, "000000009", "Harry Potter and the Philosopher's Stone", "J. K. Rowling", a1date)) {
printf("Initialization succeeded\n");
printf("%s\n", a1.title);
//it prints initialization succeeded but not a1.title
}
else {
printf("Initialization failed\n");
}
答案 0 :(得分:1)
您试图返回一个struct book *
,但是您将该函数声明为返回int
(或int *
)。这行不通。
您需要将返回类型更改为struct book *
。接下来,删除不必要的p_book
参数并将其转换为局部变量:它没有用。结果看起来像这样:
struct book *init_book(const char *p_id, const char *p_title, const char * p_author, struct date p_release) {
struct book *p_book = malloc(sizeof *p_book);
for (int i = 0; i < 10; i++) {
p_book->id[i] = p_id[i];
}
p_book->title = malloc(strlen(p_title) + 1);
p_book->author = malloc(strlen(p_author) + 1);
strcpy(p_book->title, p_title);
strcpy(p_book->author, p_author);
p_book->release_date = p_release;
return p_book;
}
(我还修复了代码中字符串分配和复制中的错误:您的代码没有分配足够的空间,但是由于您移动了指针而不是复制了内容,分配还是被泄漏了。)
它的名字是这样的:
struct book *p_book = init_book("000000009", "Harry Potter and the Philosopher's Stone", "J. K. Rowling", a1date);
if (p_book) {
printf("Initialization succeeded\n");
printf("%s\n", a1.title);
} else {
printf("Initialization failed\n");
}
答案 1 :(得分:1)
对于其他答案,我将采用不同的方法。我认为函数的返回值应该是状态而不是初始化的struct book
,因为您要传递指向要初始化的struct book
的指针。在这种情况下,您不应该malloc
来读书,因为您要传递的指针应该已经指向struct book
的有效存储位置。
使用返回值指示初始化是否发生错误。
在不了解您的struct book
的情况下,很难说出是否需要malloc
的任何成员变量,或者只是分配指针。如果确实需要使用malloc
,则可以使用对malloc
的调用中的返回码来设置自己的返回值,以指示是否存在错误。
答案 2 :(得分:0)
函数的返回类型应该与您要返回的任何内容的类型匹配。因此,要返回类型为p_book
的{{1}},则您的返回类型应该为struct book *
。