G++ stack smashing detected

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

#include<algorithm>

using namespace std;

int main()
{
    int test[6];
    int* beg = test;
    int* end = test + sizeof(test)/sizeof(*test) - 1;
    for(int i = 0; i <= 6; ++i)
        {
      test[i] = i*2;
      }
     while(beg <= end)
       {
        //swap(&end,&beg);
    *beg ^= *end ^= *beg ^= *end;
    beg++;end--;
    }
 for(const int* p = test; p < test + sizeof(test)/sizeof(*test); p++)
   {
     cout << *p <<endl;
 }
return 0;
}

Программа компилируется успешно и на экран выводится обернутый массив, но возникает ошибка stack smashing detected, как это возможно устранить ?

И при использовании функции swap( ) из библиотеки alghorithm как правильно передавать в нее указатели, чтобы их обмен выполнялся верно?


Ответы (1 шт):

Автор решения: Harry

Сколько у вас элементов в массиве int test[6];? Шесть. А со сколькими вы работаете? for(int i = 0; i <= 6; ++i)? С семью :(

И еще - формально *beg ^= *end ^= *beg ^= *end; не очень хорошо, хак...

А еще - зачем вам пытаться менять элемент с самим собой? (while(beg <= end))? Тут просто < и логичнее и вернее - когда beg == end, получается ерунда.

Словом, я бы делал так:

int main()
{
    int test[7];
    for(int i = 0; i <= 6; ++i)
    {
        test[i] = i*2;
    }

    int* beg = test;
    int* end = test + sizeof(test)/sizeof(*test) - 1;

    while(beg < end) swap(*beg++,*end--);

    for(const int* p = test; p < test + sizeof(test)/sizeof(*test); p++)
    {
        cout << *p <<endl;
    }
}

Впрочем, нет, соврал! я бы делал так:

reverse(test, test+7);

:)

→ Ссылка