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 шт):
Сколько у вас элементов в массиве 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);
:)