return возвращает целое число из указателя без приведения при возврате структуры - PullRequest
0 голосов
/ 10 июля 2019

Я пишу код для школьного проекта, в котором мы определяем библиотеку, и я не могу заставить мою функцию возвращаться правильно

Я попытался переопределить свой код и изменить 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 ]

1 голос
/ 10 июля 2019

Вы пытаетесь вернуть 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 голос
/ 10 июля 2019

Я собираюсь принять другой подход к другим ответам. Я думаю, что возвращаемое значение вашей функции предназначено для статуса, а не для инициализированного struct book, так как вы передаете указатель на struct book, который вы хотите инициализировать. В этом случае вы не должны malloc писать книгу, потому что указатель, который вы передаете, должен уже находиться в допустимом месте в памяти struct book.

Используйте возвращаемое значение, чтобы указать, произошла ли ошибка при инициализации.

Не зная больше о вашем struct book, трудно сказать, нужно ли вам malloc какую-либо из переменных-членов или просто назначить указатели. Если вам нужно использовать malloc, тогда вы можете использовать код возврата из ваших вызовов на malloc, чтобы установить собственное значение возврата, чтобы указать, была ли ошибка.

0 голосов
/ 10 июля 2019

Возвращаемый тип функции должен соответствовать типу того, что вы пытаетесь вернуть. Таким образом, чтобы вернуть p_book, типа struct book *, тогда ваш тип возврата должен быть struct book *.

...