返回值从指针返回整数,而在返回结构时不进行强制转换

时间:2019-07-10 14:05:00

标签: c pointers struct malloc

我正在为一个学校项目编写代码,我们正在定义一个库,但我无法让函数正确返回

我试图重新定义我的代码并将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");
    }

3 个答案:

答案 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 *