Я борюсь с динамическим распределением памяти и не знаю, что не так с логикой приведенного ниже кода. Может кто-нибудь дать мне объяснение и исправить то, что не так.
struct Books {
char *title = new char[0];
char *author;
int pages = 0;
int price = 0;
};
int main()
{
struct Books book;
/*char size = (char)malloc(sizeof(book.title));*/
printf("The title of the book is:\n");
fgets(book.title, sizeof(book.title), stdin);
printf("The title is:\n %s", book.title);
}
Для меня это не похоже на действительный c. Например, «новый» - это не оператор C - это C++.
Вы не можете инициализировать переменные внутри определения структуры. Удалите все назначения изнутри структуры. Затем установите book.title = malloc( n );
, где n
- размер в байтах для выделения. Также помогает, если вы знаете разницу между C и C++ и решаете, на каком языке вы действительно программируете.
new char[0]
? Неужели не нужен байт? Но вы читаете элементы sizeof(book.title)
(размер указателя, а не указатель на массив). Это не может сработать.
Есть список хороших книг по C++ здесь.
Вот как написать свой код, чтобы он был законным C
struct Books {
char *title;
char *author;
int pages;
int price;
};
int main()
{
struct Books book;
book.title = malloc(100);
printf("The title of the book is:\n");
fgets(book.title, 100, stdin);
printf("The title is:\n %s", book.title);
}
Это будет описано в любой книге по C, вам действительно стоит ее прочитать.
В общем, есть два способа справиться с подобными случаями: вы можете использовать массивы символов с заранее определенным размером, и в этом случае вы должны убедиться, что не записали больше символов, чем может вместить в него массив. Код с массивами заранее определенного размера будет выглядеть так:
struct Books {
char title[255];
char author[255];
int pages;
int price;
};
int main()
{
struct Books book;
printf("The title of the book is:\n");
fgets(book.title, sizeof(book.title), stdin);
printf("The title is:\n %s", book.title);
}
В приведенном выше случае допустимо использовать sizeof (book.title), потому что размер известен во время компиляции. Но «заголовок» никогда не может превышать 254 символа.
Другой способ - использовать динамическое распределение памяти:
struct Books {
char * title;
char * author;
int pages;
int price;
};
int main()
{
struct Books book;
book.title = NULL;
size_t n = 0;
printf("The title of the book is:\n");
getline(&book.title, &n, stdin);
printf("The title is:\n %s", book.title);
free(book.title);
}
В этом случае функция getline () выделяет вам память, поэтому предопределенного максимального размера строки нет. Но вы должны освободить его самостоятельно, а также не можете использовать sizeof () для получения размера массива.
Пожалуйста, подробно расскажите, что вы пытаетесь сделать, каков ожидаемый результат и каков ваш текущий результат.