The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"строки в С"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"строки в С"  
Сообщение от fa email(??) on 09-Май-07, 15:21 
Привет всем. Помогите новичку разобраться в строках. Пытаюсь инициализировать переменную из функции. Путем проб и ошибок (все остальное пока вываливалось в segmentation fault) пришел к вот такому:

char* foo()
{
  char *a = malloc(100);
  strcpy(a,"my string");
  return a;
}

char* my_var = foo();

Правильно ли так писать? Освобождается ли память, выделенная malloc-ом после выхода из foo?
Заранее спасибо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

  • строки в С, devcoder, 15:23 , 09-Май-07, (1)  
  • строки в С, Michelnok, 18:23 , 09-Май-07, (2)  

Сообщения по теме [Сортировка по времени, UBB]


1. "строки в С"  
Сообщение от devcoder email(ok) on 09-Май-07, 15:23 
>char* foo()
>{
>  char *a = malloc(100);
>  strcpy(a,"my string");
>  return a;
>}
>
>char* my_var = foo();
printf("%s\n", my_var);
free(my_var);

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "строки в С"  
Сообщение от Michelnok (ok) on 09-Май-07, 18:23 
>
>char* foo()
>{
>  char *a = malloc(100);
>  strcpy(a,"my string");
>  return a;
>}
>
>char* my_var = foo();
>
>Правильно ли так писать?

В данном конкретном случае - нормально.
Но где гарантия что strlen("my string") будет меньше 100? Всегда сначала надо узнать нужный размер блока памяти, а потом только вызывать malloc. Кроме того, вместо strcpy рекомендуется использовать функции, в которых указывается размер блока памяти (к сожалению, они не все еще стандартизированы).

>Освобождается ли память,
>выделенная malloc-ом после выхода из foo?

Нет. malloc(3) выделяет память в куче и время жизни выделенных ей блоков не зависит от входов/выходов из функций. Блок памяти будет жить до вызова free(3).

Для выделения блоков памяти заранее неизвестного размера в стеке (чтобы они автоматически удалялись по выходу из функции) можно использовать alloca(3). Хотя это не совсем (совсем не) стандартный вызов, да и не рекомендуют его использовать для больших блоков памяти и/или на платформах с маленькими стеками, но иногда он предпочтительней чем malloc (например, для избежания фрагментации кучи, что критично в долгоработающих демонах).

>Заранее спасибо.

А вообще весь твой код можно смело заменить на

char* my_var = strdup("my string");

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру