void GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
}
Возвращение указателя на строку
char* GetTheString()
{
char s[10]="HELLO";
char buf[10];
strcpy(buf,s);
return buf;
}
как вернее?
Код:
В твоем коде buf - прекращает свое существование при выходе из функции, и результирующий указатель будет ссылатся сначала действительно на твою строку, но при первом же возможном случае туда будет записано что-то другое.
А так ты в функцию передаш, указатель на строку в которую надо будет занести результат.
Как вариант также
Код:
char* GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
return result;
}
{
char s[10]="HELLO";
strcpy(result, s);
return result;
}
Цитата: Lone Wolf
Код:
void GetTheString(char* result)
{
char s[10]="HELLO";
strcpy(result, s);
}
{
char s[10]="HELLO";
strcpy(result, s);
}
переписывать в резалт массив s небезапасно, т.к. мы не знаем его размер, а это может быть и указатель на одиночный символ.
Цитата:
Как вариант также
Код:
char* GetTheString(char* result) // rezult нулевой указатель
{
char s[10]="HELLO";
strcpy(result, s);
return result;
}
{
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;
}
{
char s[]="HELLO";
rezult = (char*)malloc(sizeof(char)*(strlen(s)+1));
strcpy(result, s);
return result;
}
согласен, но если заранее известна длина строки, то проще не замарачиватся с кучей.
Код:
std::string str("megastring");
.......
return str;
............
const char * p_str = str.c_str();
.......
return str;
............
const char * p_str = str.c_str();
Код:
char* GetTheString()
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}
Цитата: ***Zebr@XXL***
Как вариант:
Код:
char* GetTheString()
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}
{
char s[10]="HELLO";
static char buf[10];
strcpy(buf,s);
return buf;
}
Очень опасный вариант. Можно огрести проблем.
Цитата: Green
Можно огрести проблем.
Если не секрет, то каких?
Приведу простые примеры, в действительности они могут быть намного запутаннее.
Пример 1.
Как понимаю функция возвращает различные данные в зависимости от входных данных, времени года и т.п. (а иначе зачем здесь функция?)
Код:
char str1 = GetTheString(arg1);
....
char str2 = GetTheString(arg2);
....
....
char str2 = GetTheString(arg2);
....
Ап ля, и значение ранее инициализированной str1 НЕЯВНО изменяется при повторном вызове функции.
Пример 2.
Код:
char str1 = GetTheString();
....
char str2 = GetTheString();
....
str1[0] = '\0';
....
char str2 = GetTheString();
....
str1[0] = '\0';
Мало того что значение str1 неявно изменилось при втором вызове функции, так ещё и значение str2 НЕЯВНО изменилось при работе с str1.
Пример 3.
Код:
char str1 = GetTheString();
....
strcpy(str1, "Hellow world!");
....
strcpy(str1, "Hellow world!");
Ап ля, и получаем Overflow.
Выводы:
1) категорично избавляйтесь от неявных зависимостей;
2) не пренебрегайте и не теряйте информацию о типе, в т.ч. и о размерностях;
3) используйте const, не пренебрегайте им.
Код:
void GetTheString( char* buffer, int buffer_len )
{
char s[10]="HELLO";
strcpy_s(buffer,buffer_len,s);
}
{
char s[10]="HELLO";
strcpy_s(buffer,buffer_len,s);
}