LINUX.ORG.RU

malloc


0

0

Нужно ли делать free в процедуре в к-рой для переменной вызывается malloc? Напр:

char *proca (char *a) { char *b = (char *) malloc (255);

b = "something text";

strcat(a, b);

return (a);

free(b); //вот насколько критична эта строка? }

Говорят, что жизненный цикл локальных переменных определен процедурой(методом) в которой они были объявлены и при выходе из нее память под таке переменные освобождаются автоматически...

И еще:

как насчет такой реализации:

char *proca (char *a) { char *ret = (char *) malloc (255);

ret = "text";

return ret;

}

если мы из другой функции вызовем эту всего лишь для вывода в stdout возвращаемой строки, то не будут ли 255 байт заполнены ненужными данными (если да, то как их удалить)

И еще один детский вопрос:

критично ли объявление void proca(char *a) вместо void proca(const char *a) ,если известно, что char *a - будет именно const. Т.е. будет ли большой ошибкой если я поленюсь приписать "const"?

Спасибо!

anonymous

Может лучше книгу Кернигна и Ритчи прочитать

char *proca (char *a) { char *b = (char *) malloc (255);

b = "something text";

strcat(a, b);

return (a);

free(b); //вот насколько критична эта строка? }

1)free(b) никогда не выполняется, return (a); завершает процедуру. 2)первая строчка выделяет память размером 255 и присваевает указатель на эту память b, вторая строчка МЕНЯЕТ содержимое b и делает его равным указателю на статическую память где размещается "something text" И В ДАННОМ СЛУЧАЕ ХОРОШО ЧТО free(b); никогда не выполняется, т. к. повторюсь b указывает на "something text", а не 255 байт которые выделены в начале.

3)Насчет цикла жизни локальных переменых имется ввиду следуещее елси вы написали в начале функции написали char b[255]; то эта память будет освобождена, а вот если использовать malloc, то надо написать где-то free.

4)Модификатор const используется для самоконтроля, чтобы не поменять случайно то, что не надо менять. Если хочешь можешь его не использовать.

anonymous
()

>char *b = (char *) malloc (255);
Ты выделяешь память и сохраняешь указатель на нее указатель в b

>b = "something text";
Ты записываешь в b указатель на строку, теряя исходный указатель, полученный от malloc.

>free(b);
Пытаешься освободить память по указателю, который тебе вернул не malloc, поэтому на 99% упадешь ...

>критично ли объявление void proca(char *a) вместо void proca(const char *a) ,если известно, что char *a - будет именно const. Т.е. будет ли большой ошибкой если я поленюсь приписать "const"?

Большой не будет точно. Предполагаю, что не будет и маленькой ...

Murr ★★
()
Ответ на: комментарий от Murr

Т.е. будет ли большой ошибкой если я поленюсь приписать "const"? Большой не будет точно. Предполагаю, что не будет и маленькой ...

ну если ++ обсуждать то весьма неприятная ошибка/особенность.

не для того даже, кто писал функцию, для того кто пользовать будет.

типа если void print(char *p);

то print("string"); обломится. абыдна, да?

HTH

anonymous
()
Ответ на: RE: от Murr

не знаю модно или нет, а для работы с неинициализированной памятью напр под буфера чем не метод, особенно если stl старый.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.