тупой вопрос по C++ ;)

User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

тупой вопрос по C++ ;)

Post by Okie »

В чем проблема в этой функции? На указанной строке происходит memory write violation. За bounds я не вылажу. WTF? Компилятор - VC++ 7.1.


Code: Select all

void reverse(char* str, int start, int end)
{
   if(end >= strlen(str))
      end = strlen(str)-1;

   for(int i=start; i<(start+end)/2; i++)
   {
      char buf = str[i];
      int endIndex = end-i;
      str[i] = str[endIndex]; //  <--- runtime error!
      str[endIndex] = buf;
   }
}


первый параметр (str) в вызывающем коде объявлен вот так:
char* str = "one two three";
То есть никакой это не const.
Kastet
Уже с Приветом
Posts: 2018
Joined: 04 Jun 2002 16:38
Location: NYC

Post by Kastet »

Если start > end или start >strlen(str) то вы вылазите за bounds.
"... но это рискованный шаг, поскольку курдль может чихнуть. Мало какой охотник
пережил чихание курдля... "
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

Не вылажу :) Вот как я вызываю эту функцию:

Code: Select all

   
char* str = "one two three";
int size = strlen(str);
reverse(str, 0, size-1);

Да, кстати, ошибка вываливается на первой же итерации цикла.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Re: тупой вопрос по C++ ;)

Post by tengiz »

Okie wrote:То есть никакой это не const.

Строка "one two three" и есть самый настоящий const. То, на что Вы напоролись - дырка в стандарте, которую оставили для совместимости с С, в котором слова const не было. Поэтому авторы стандарта "смалодушничали" и разрешили неявное приведение типа (const char* -> char*) ровно для этого случая.
Cheers
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

Тока что скомпилировал в g++ под солярисом. Segmentation fault :x Значит, действительно код кривой. Но в каком месте? 8O
User avatar
theukrainian
Уже с Приветом
Posts: 2506
Joined: 13 Jan 2003 22:34
Location: Kiev :: Los Angeles, CA

Post by theukrainian »

User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Re: тупой вопрос по C++ ;)

Post by Okie »

tengiz wrote:
Okie wrote:То есть никакой это не const.

Строка "one two three" и есть самый настоящий const. То, на что Вы напоролись - дырка в стандарте, которую оставили для совместимости с С, в котором слова const не было. Поэтому авторы стандарта "смалодушничали" и разрешили неявное приведение типа (const char* -> char*) ровно для этого случая.

Ну и ну 8O Спасибо, Тенгиз.
User avatar
Okie
Уже с Приветом
Posts: 932
Joined: 18 Mar 2000 10:01
Location: Seattle

Post by Okie »

theukrainian wrote:http://www.eskimo.com/~scs/C-faq/q1.32.html

That's it! Thanks :)

Return to “Вопросы и новости IT”