Про char указатели, массивы и malloc - C (СИ)
Формулировка задачи:
Если у меня есть функция,
1) Нужно ли мне выделять память malloc? Я просто не понимаю, считается ли это что результат известен на момент компиляции, если он вводит строку(массив символов) и char* принимает эту строку с любым размером
Или мне надо написать?
Какой вариант будет правильнее?
2) Где лучше всего писать free в Си если пишешь что-то по типу библиотеки(так как в 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);
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);
Решение задачи: «Про 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);
Объяснение кода листинга программы
В данном коде представлен простейший вариант создания консоли с заданным заголовком, шириной и высотой.
- В функции
init_console
создается новый указатель типаconsole*
с именемret_cns
. Значение этого указателя будет содержать адреса памяти, выделенные с помощьюmalloc
. - Выделяется память под строку заголовка консоли с помощью
malloc
и присваивается указателюret_cns->title
. - С помощью
strcpy
содержимое строкиtitle
копируется в выделенную память. - Выделяется память под поля ширины и высоты с помощью
malloc
и присваивается указателямret_cns->width
иret_cns->height
соответственно. - Возвращается указатель
ret_cns
в качестве результата работы функции. - В основной программе создается новая консоль с заданным заголовком, шириной и высотой с помощью функции
init_console
. - Далее, в основной программе, происходит использование этой консоли (возможно, вывод на нее информации).
- После использования, с помощью функции
free
освобождается память, выделенная под строку заголовка. - Также, с помощью функции
free
освобождается память, выделенная под саму консоль.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д