Про char указатели, массивы и malloc - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Если у меня есть функция,
typedef struct CNS
{
char* title;
int width;
int height;
} console;
 
console init_console(char title[],int width,int height)
{
console ret_cns;
ret_cns.title = title;
ret_cns.width = width;
ret_cns.height = height;
return ret_cns;
}
 
// пользователь пишет
 
console my = init_console("Hello world!",320,240);
1) Нужно ли мне выделять память malloc? Я просто не понимаю, считается ли это что результат известен на момент компиляции, если он вводит строку(массив символов) и char* принимает эту строку с любым размером Или мне надо написать?
typedef struct CNS
{
char* title;
int width;
int height;
} console;
 
console init_console(char title[],int width,int height)
{
console ret_cns;
ret_cns.title = malloc(strlen(title)*sizeof(char));
ret_cns.title = title; // сначала выделить память присвоением а потом присвоить опять как я понимаю?
ret_cns.width = width;
ret_cns.height = height;
return ret_cns;
}
 
// пользователь пишет
 
console my = init_console("Hello world!",320,240);
Какой вариант будет правильнее? 2) Где лучше всего писать free в Си если пишешь что-то по типу библиотеки(так как в C++ есть деструкторы и об этом думать особо не надо) Спасибо

Решение задачи: «Про char указатели, массивы и malloc»

textual
Листинг программы
console* init_console(char title[],int width,int height)
{
console *ret_cns;
ret_cns = (console*)malloc(sizeof(console));
ret_cns->title = (char*)malloc((strlen(title)+1)*sizeof(char));
strcpy(ret_cns->title,title); 
ret_cns->width = width;
ret_cns->height = height;
return ret_cns;
}
 
// пользователь пишет
 
console *my = init_console("Hello world!",320,240);
............
free(my->title);
free(my);

Объяснение кода листинга программы

В данном коде представлен простейший вариант создания консоли с заданным заголовком, шириной и высотой.

  1. В функции init_console создается новый указатель типа console* с именем ret_cns. Значение этого указателя будет содержать адреса памяти, выделенные с помощью malloc.
  2. Выделяется память под строку заголовка консоли с помощью malloc и присваивается указателю ret_cns->title.
  3. С помощью strcpy содержимое строки title копируется в выделенную память.
  4. Выделяется память под поля ширины и высоты с помощью malloc и присваивается указателям ret_cns->width и ret_cns->height соответственно.
  5. Возвращается указатель ret_cns в качестве результата работы функции.
  6. В основной программе создается новая консоль с заданным заголовком, шириной и высотой с помощью функции init_console.
  7. Далее, в основной программе, происходит использование этой консоли (возможно, вывод на нее информации).
  8. После использования, с помощью функции free освобождается память, выделенная под строку заголовка.
  9. Также, с помощью функции free освобождается память, выделенная под саму консоль.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы