LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

Если там, где используется 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, :

Если там, где используется 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()));