Форум программистов, компьютерный форум CyberForum.ru

return + char* - C++

Восстановить пароль Регистрация
 
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 14:05     return + char* #1
Как я понимаю, он вернет всякую чушь, потому что локальная переменная m уничтожается по завершению функции. Тогда нужно выделять память с помощью new, а потом в коде освобождать ее, так?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char * func(char *a, char *b)
{
  char m[strlen(a) + strlen(b) + 1];
  int i;
  for(i = 0; i<strlen(a); ++i) m[i] = a[i];
  for(int j=0; j<strlen(b); ++j)
  {
    m[i++] = b[j];
  }
  m[i] = '\0';
  return m;
}
 
 
int main()
{
  char *a = "qwe", *b = "rty", *c = func(a, b);
  return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
28.06.2012, 14:20     return + char* #2
.Так.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 14:21  [ТС]     return + char* #3
lazybiz, как тогда реализован стринг?
он же возвращает const char * (c_str()), который нигде освобождать не надо
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
28.06.2012, 14:55     return + char* #4
Я думаю этот указатель храниться внутри класса, и освобождается в деструкторе.

Добавлено через 16 минут
Так и есть.
The returned array points to an internal location with the required storage space for this sequence of characters plus its terminating null-character, but the values in this array should not be modified in the program and are only guaranteed to remain unchanged until the next call to a non-constant member function of the string object.
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
28.06.2012, 19:25     return + char* #5
Ksan, каким компилятором пользовались, когда писали этот код, если не секрет?
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 19:40  [ТС]     return + char* #6
gooseim, Написал в поле создания темы. Я не компилил это. Ведь важен был сам ответ, а не конкретная программа.

Но вообще пользуюсь Dev-cpp
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
28.06.2012, 19:47     return + char* #7
Ksan, тогда понятно. Если задать постоянный буфер (например, если вы будете точно знать, что все поместится в FFFF-байт), то можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char * func(char *a, char *b)
{
  static char m[0xFFFF];
  int i;
  for(i = 0; i<strlen(a); ++i) m[i] = a[i];
  for(int j=0; j<strlen(b); ++j)
  {
    m[i++] = b[j];
  }
  m[i] = '\0';
  return m;
}
 
 
int main()
{
  char *a = "qwe", *b = "rty", *c = func(a, b);
  return 0;
}
В этом случае переменная уничтожаться не будет после выхода из функции и явно ее удалять не нужно.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 19:50  [ТС]     return + char* #8
gooseim,

1) она будет существовать всю программу, даже если уже не нужна
2) есть мне нужно 2 раза вызвать функцию, то первый результат затрется
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
28.06.2012, 19:53     return + char* #9
Ksan,
1 - да, но FFFF байт для системы это ничего
2 - да, но можно полученное значение сразу копировать в нужную переменную и там его сохранять
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 19:57  [ТС]     return + char* #10
gooseim, а почему не 0xFF?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
28.06.2012, 19:59     return + char* #11
Ksan, чтобы больше поместилось. FF всего лишь 255 байт.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
28.06.2012, 21:10     return + char* #12
C++
1
char m[strlen(a) + strlen(b) + 1];
Не совсем по теме, но
Чтобы даже просто так сделать вроде как уже нужно выделять память с помощью new

А в Dev C++ это не так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 22:03     return + char*
Еще ссылки по теме:

C++ Ошибка в cannot convert char * to char вроде поправил теперь выводит ересь(
Возврат char* через return C++
error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
28.06.2012, 22:03     return + char* #13
daslex, в с++ так нельзя, в с можно.
Yandex
Объявления
28.06.2012, 22:03     return + char*
Ответ Создать тему
Опции темы

Текущее время: 23:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru