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

Ваш аккаунт

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

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

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

Возвращение указателя на строку

436
27 мая 2007 года
Fevzi
87 / / 02.04.2005
Я знаю, что этот код сработает неправильно:
char* GetTheString()
{
char s[10]="HELLO";
char buf[10];
strcpy(buf,s);
return buf;
}
как вернее?
274
27 мая 2007 года
Lone Wolf
1.3K / / 26.11.2006
 
Код:
void GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
}


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

Как вариант также
 
Код:
char* GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
return result;
}
242
27 мая 2007 года
Оlga
2.2K / / 04.02.2006
Цитата: Lone Wolf
 
Код:
void GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
}



переписывать в резалт массив s небезапасно, т.к. мы не знаем его размер, а это может быть и указатель на одиночный символ.

Цитата:

Как вариант также
 
Код:
char* GetTheString(char* result) // rezult нулевой указатель
{
char s[10]="HELLO";
strcpy(result, s);
return result;
}

также не знаем является ли резалт массивом, если да, то какой его размер.

 
Код:
char* GetTheString(char* result)
{
   char s[]="HELLO";
   rezult = (char*)malloc(sizeof(char)*(strlen(s)+1));
   strcpy(result, s);
   return result;
}
274
27 мая 2007 года
Lone Wolf
1.3K / / 26.11.2006
согласен, но если заранее известна длина строки, то проще не замарачиватся с кучей.
63
27 мая 2007 года
Zorkus
2.6K / / 04.11.2006
Если вам нужно возвратить непременно char * (который, как я понял, используется в качестве строки), то необходимо возвращать и количество символов возвращаемых - иначе откуда вы узнаете, что и в каком кол-ве вернули вам. Но не проще ли возвращать std::string - объект, из которого всегда нужный char * получить можно.
 
Код:
std::string str("megastring");
.......
return str;
............
const char * p_str = str.c_str();
7.9K
28 мая 2007 года
***Zebr@XXL***
47 / / 18.08.2005
Как вариант:
 
Код:
char* GetTheString()
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}
3
28 мая 2007 года
Green
4.8K / / 20.01.2000
Цитата: ***Zebr@XXL***
Как вариант:
 
Код:
char* GetTheString()
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}


Очень опасный вариант. Можно огрести проблем.

7.9K
29 мая 2007 года
***Zebr@XXL***
47 / / 18.08.2005
Цитата: Green
Можно огрести проблем.


Если не секрет, то каких?

3
29 мая 2007 года
Green
4.8K / / 20.01.2000
Не секрет.
Приведу простые примеры, в действительности они могут быть намного запутаннее.

Пример 1.
Как понимаю функция возвращает различные данные в зависимости от входных данных, времени года и т.п. (а иначе зачем здесь функция?)
 
Код:
char str1 = GetTheString(arg1);
....
char str2 = GetTheString(arg2);
....

Ап ля, и значение ранее инициализированной str1 НЕЯВНО изменяется при повторном вызове функции.

Пример 2.
 
Код:
char str1 = GetTheString();
....
char str2 = GetTheString();
....
str1[0] = '\0';

Мало того что значение str1 неявно изменилось при втором вызове функции, так ещё и значение str2 НЕЯВНО изменилось при работе с str1.

Пример 3.
 
Код:
char str1 = GetTheString();
....
strcpy(str1, "Hellow world!");

Ап ля, и получаем Overflow.

Выводы:
1) категорично избавляйтесь от неявных зависимостей;
2) не пренебрегайте и не теряйте информацию о типе, в т.ч. и о размерностях;
3) используйте const, не пренебрегайте им.
7.9K
29 мая 2007 года
***Zebr@XXL***
47 / / 18.08.2005
Понятно. Что-то сразу в голову не пришло. Можно другой вариант, который очень любят использовать в CRT:
 
Код:
void GetTheString( char* buffer, int buffer_len )
{
char s[10]="HELLO";
strcpy_s(buffer,buffer_len,s);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог