Как вернуть строку из функции без передачи каких-либо параметров в C - PullRequest
1 голос
/ 26 апреля 2011

Я хочу написать функцию, которая просто возвращает строку, чтобы я мог сделать это:

TCHAR sVar[256] = {0};
_stprintf(sVar,L"%s",GetCurrentTime());

Я не могу реализовать эту функцию с помощью следующей функции, поскольку память b / c освобождается перед возвратом значения:

TCHAR *GetCurrentTime(void)
{
    TCHAR *sVal;
    sVal = (TCHAR *) calloc(64+1, sizeof(TCHAR));       
    GetCurrentTimeEx(sVal); // Populates
    free(sVal);sVal=NULL;
    return sVal;
}

и я не могу выполнить эту функцию, потому что есть утечка памяти, если я не помню, чтобы она освобождала память в вызывающей программе, что сводит на нет цель заставить простую функцию возвращать строку символов:

TCHAR *GetCurrentTime(void)
{
    TCHAR *sVal;
    sVal = (TCHAR *) calloc(64+1, sizeof(TCHAR));
    GetCurrentTimeEx(sVal);
    return sVal;
}

и я не хочу объявлять память вне стека .:

TCHAR *GetCurrentTime(void)
{
    static TCHAR sVal[64];
    GetCurrentTimeEx(sVal);
    return sVal;
}

(вот функция, которая получает время):

DWORD GetTime(TCHAR *sCurrentTime)
{
    TCHAR sTime[9] = {0};
    if (_tstrtime_s(sTime, 9) == ERROR_SUCCESS)
        {
        INT i;
        for (i=0;i<=4;i++)
            sCurrentTime[i] = sTime[i];
        return 1;
        }
    else
        return 0;
}

Я искал, но не мог найти ответ на этот довольно распространенный вопрос. Кто-нибудь может мне помочь? Спасибо.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Вы можете сделать это с буфером static, как в вашем собственном примере:

char *GetCurrentTime(void)
{
    static char sVal[64];
    GetCurrentTimeEx(sVal);
    return sVal;
}

, который фактически не выделяет память в стеке, но в статической области,Это решение не является повторным входом и не поточно-ориентированным, но это единственный способ получить точную идиому, которую вы хотите в C, без утечек памяти.

Идиоматическое решение состоит в том, чтобы распределить память ответственность завызывающий и передать буфер в качестве аргумента.

2 голосов
/ 26 апреля 2011

Вы можете передать предварительно выделенное TCHAR*, которое GetCurrentTime() будет использовать для ввода времени:

TCHAR *GetCurrentTime(TCHAR *buf)
{
    GetCurrentTimeEx(buf);
    return buf;
}

И это называется так:

TCHAR buf[64+1];
_stprintf(sVar,L"%s",GetCurrentTime(buf));

или как

TCHAR buf[64+1];
GetCurrentTime(buf);
_stprintf(sVar,L"%s",buf);

Хотя, конечно, это выделяется из стека, чего вы, возможно, не хотите. С другой стороны, поскольку это не static, он будет, по крайней мере, повторно входить в многопоточную среду.

0 голосов
/ 26 апреля 2011

Существует три способа создания объекта в C - динамически (с помощью malloc и др.), Автоматически (в стеке) и статически.Вы говорите, что не хотите делать ничего из этого, и в этом случае я боюсь, что вам не повезло.

...