Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Возврат массива(строки) из функции.

590
30 ноября 2007 года
Gigahard
223 / / 03.04.2006
Корректен ли следующий код:

 
Код:
char* createString()
{
    char a[]="abracadabra";
    return a;
}

char *b=createString();


Согласно правилам, память зарезервированная под переменную объявленную в функции освобождается при выходе из функции.
Что мы имеем в данной ситуации... Внутри тела функции мы резервируем диапазон адресов. Потом мы возвращаем из функции указатель на адрес первой ячейки. Адрес этой ячейки копируется в переменную b. А что происходит с остальным диапазоном памяти при выходе из функции? Ведь по идее вся зарезервированная область памяти освобождаются. Т.е. данные то могут и сохранится, но они уже не будут защищены от изменения извне.

Обращаться к такому массиву полученому из функции будет некорректно?
260
30 ноября 2007 года
Ramon
1.1K / / 16.08.2003
Так делать нельзя.

 
Код:
char* createString()
{
    char a[]="abracadabra";
    return a;
}


сделает массив в стеке и копирнет туда строку после чего вернет указатель на сей массив, а массив станет невалидным при выходе из фц-ии.

Правильно будет так:
 
Код:
const char* 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
590
30 ноября 2007 года
Gigahard
223 / / 03.04.2006
Я как бы не пытаюсь выяснить как правильно, это я и так знаю. Я хочу выяснить насколько может быть правильным формально неправильный вариант.

сделает массив в стеке и копирнет туда строку после чего вернет указатель на сей массив, а массив станет невалидным при выходе из фц-ии.
Вот вот... Об этом я и говорю... Значит всеж недопустимо.

Вот собственно и пример наваял
Код:
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);

На примере видно, что память не защищена от изменений.
505
30 ноября 2007 года
vAC
343 / / 28.02.2006
Вы пытаетесь найти решение или хотите разобраться в механизме работы языка?
В первом случае рекомендую использовать STL.
590
30 ноября 2007 года
Gigahard
223 / / 03.04.2006
vAC
Второе ;) Хочется разобраться "... Что такое хорошо и что такое плохо..." © :))
505
30 ноября 2007 года
vAC
343 / / 28.02.2006
Это правильно, очень полезно. Я вот до сих пор обнаруживаю некоторые тонкости языка, о которых даже не подозревал раньше :)
Еще очень рекомендую почитать док ISO-IEC 14882 - там можно найти то, чего в литературе мало встречается.
590
30 ноября 2007 года
Gigahard
223 / / 03.04.2006
vAC Спасибо за документик :) Сам стараюсь придерживаться стандартов.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог