char* createString()
{
char a[]="abracadabra";
return a;
}
char *b=createString();
Возврат массива(строки) из функции.
Код:
Согласно правилам, память зарезервированная под переменную объявленную в функции освобождается при выходе из функции.
Что мы имеем в данной ситуации... Внутри тела функции мы резервируем диапазон адресов. Потом мы возвращаем из функции указатель на адрес первой ячейки. Адрес этой ячейки копируется в переменную b. А что происходит с остальным диапазоном памяти при выходе из функции? Ведь по идее вся зарезервированная область памяти освобождаются. Т.е. данные то могут и сохранится, но они уже не будут защищены от изменения извне.
Обращаться к такому массиву полученому из функции будет некорректно?
Код:
char* createString()
{
char a[]="abracadabra";
return a;
}
{
char a[]="abracadabra";
return a;
}
сделает массив в стеке и копирнет туда строку после чего вернет указатель на сей массив, а массив станет невалидным при выходе из фц-ии.
Правильно будет так:
Код:
const char* createString()
{
static const char[] a = "abracadabra";
// или
// const char* a = "abracadabra";
return a;
}
const char* b = createString();
{
static const char[] a = "abracadabra";
// или
// const char* a = "abracadabra";
return a;
}
const char* b = createString();
PS: А вообще, такая тема была, юзаем поиск.
PS2: Для ленивых http://forum.codenet.ru/showthread.php?t=40638
сделает массив в стеке и копирнет туда строку после чего вернет указатель на сей массив, а массив станет невалидным при выходе из фц-ии.
Вот вот... Об этом я и говорю... Значит всеж недопустимо.
Вот собственно и пример наваял
Код:
char* createString(bool choice)
{
char a[15];
memset(a,NULL,15);
if(choice)
{
memcpy(a,"abracadabra", 12);
}
else
{
memcpy(a,"blah-blah", 10);
}
return a;
}
char *b, *c;
b=createString(true);
c=createString(false);
{
char a[15];
memset(a,NULL,15);
if(choice)
{
memcpy(a,"abracadabra", 12);
}
else
{
memcpy(a,"blah-blah", 10);
}
return a;
}
char *b, *c;
b=createString(true);
c=createString(false);
На примере видно, что память не защищена от изменений.
В первом случае рекомендую использовать STL.
Второе ;) Хочется разобраться "... Что такое хорошо и что такое плохо..." © :))
Еще очень рекомендую почитать док ISO-IEC 14882 - там можно найти то, чего в литературе мало встречается.
vAC Спасибо за документик :) Сам стараюсь придерживаться стандартов.