LINUX.ORG.RU

а что так нельзя?

 


0

2

что-то подумал об этом, а ведь этот пример об утечки памяти.

char *df ( )
{
  char *f = ( char * ) malloc ( 10 );
  memset ( f, 0, 10 );
  strncpy ( f, "aaa", 3 );
  return f;
}

int main ()
{
  printf ( "%s\n", df() );
}

Ответ на: комментарий от XMs

Человек не понимает, что одна функция передает результат выполнения как аргумент в другую функцию. В его сознании в printf попадает вся функция df и сразу печатает, насколько я понял.

Archer73
()
Ответ на: комментарий от XMs

Кто-нибудь может это расшифровать?

Функция возвращает указатель

char *df ()
{
  return f;
}
Если там, где используется df нет, принимающей стороны ( указателя, который хранил бы адрес ), то на память не будет указателя после выполнения printf.

Вот что я имел ввиду.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Archer73

В его сознании в printf попадает вся функция df и сразу печатает, насколько я понял.

Нет. В моем сознании выполняются функции по мере поступления как аргументы.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Archer73

Вернул аллоцированную память, убедись что сможешь её освободить.

У тебя были когда нибудь ошибки такого характера?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Если в описании функции написано, что память нужно освободить после использования, то это действительно нужно сделать. Ошибки с потерей указателя на выделенную память наверное у всех были. Но на то это и Си. Тут скорость в обмен на внимательность и аккуратность.

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

А хотя, наверное, сначала выполнятся все функции, возвратят значения, а потом уже printf например с полученным значениями начнет выполнятся.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Если там, где используется df нет, принимающей стороны ( указателя, который хранил бы адрес ), то на память не будет указателя после выполнения printf.

В вашем примере это так, но это не обязательно так бывает.

Можно хранить в указателе на указатель в аргументе:

char *df(char **mem) { 
    *mem = malloc(...);
    ........
    return *mem;
}
Можно хранить в внутри функции, но надо помнить, что так настоятельно не рекомендуется делать, не только для многопоточных программ но и даже для вызова в одном printf-е более одного раза за раз:
char *df() { 
    static char *mem = realloc(mem, ...);
    ........
    return *mem;
}
В конце концов никто вам не запрещает в printf-е написать:
printf("%s\n", (p = df()));

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.