Функция возвращает копию переменной. В случае со string - создаётся новый объект, который и возвращается. В случае с char* - копия указателя, но не области памяти.
,то ничего освободжать не надо (память для "xxx" выделена статически) - можно оставить strcat(s, f()).
Но, если память где-то выделена динамически, то после использования, её нужно освободить.
Zeus, string'и не могу, много года править. Только если придется, то уж не отделаюсь. spielmann, в случае
Код:
char *f()
{
char *x = "xxx";
return x;
}
переменная уничтожается после выхода из ф-ии, значит результат будет непредсказуемым.
В MSVC++ 2005 Express Edition ф-я возвращает какой-то мусор;
В gcc-3.4.6 - что-нибудь, например "хх".
Zeus, string'и не могу, много года править. Только если придется, то уж не отделаюсь. spielmann, в случае
Код:
char *f()
{
char *x = "xxx";
return x;
}
переменная уничтожается после выхода из ф-ии, значит результат будет непредсказуемым.
В MSVC++ 2005 Express Edition ф-я возвращает какой-то мусор;
В gcc-3.4.6 - что-нибудь, например "хх".
char *f()
{
static char x[0xff] = "xxx";
/* если функция должна возвращать разные значения */
if (smth)
strcpy(x, "yyy");
return x;
}
только чем больше статических переменных, тем больше программа потребляет памяти, и тем дольше загружается (т. к. каждая статическая переменная инициализируется при запуске).
переменная уничтожается после выхода из ф-ии, значит результат будет непредсказуемым.
Какая ещё переменная??? Из функции возвращается указатель на константу "xxx"... Собственно, выше уже про это сказали.
Извиняюсь, не заметил указатель. Теперь я не понимаю разницы между char x[]= "xxx" и char *x= "xxx". Могу понять так:
x[] - это переменная, *x - указатель. Если возвращается указатель, где хранится его значение и надо ли его освобождать?
переменная уничтожается после выхода из ф-ии, значит результат будет непредсказуемым.
Какая ещё переменная??? Из функции возвращается указатель на константу "xxx"... Собственно, выше уже про это сказали.
Извиняюсь, не заметил указатель. Теперь я не понимаю разницы между char x[]= "xxx" и char *x= "xxx". Могу понять так:
x[] - это переменная, *x - указатель. Если возвращается указатель, где хранится его значение и надо ли его освобождать?
x[] - память для массива символов выделяется на стеке: при выходе из функции он разрушается.
*x - указатель на константный массив. Он хранится в read-only памяти, освобождать его не нужно.
Если возвращается указатель, где хранится его значение и надо ли его освобождать?
В char[] - массив байт (указатель на первый элемент цепочки байт), char * - указатель первый элемент цепочки байт (массив байт). Фактической разницы нет.
Кажется, я разобрался. Случай с char x[] = {"xxx"}; выбрал неудачный, у меня инициализация не константой, а вычисляемым значением. Надо сразу передавать в ф-ю переменную под результат, можно её и вернуть, чтобы было удобно пользоваться. Т.е. я имею ввиду следующее:
Кажется, я разобрался. Случай с char x[] = {"xxx"}; выбрал неудачный, у меня инициализация не константой, а вычисляемым значением. Надо сразу передавать в ф-ю переменную под результат, можно её и вернуть, чтобы было удобно пользоваться. Т.е. я имею ввиду следующее: