Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 1
Регистрация: 25.03.2018
Сообщений: 16
1

Stack smashing detected + Массивы + Random

01.04.2018, 16:01. Показов 2070. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь реализовать программу, которая выполняла бы несколько задач.
1) Вычисление положительных чисел из массива X.
2) Вычисление наибольших 5-ти элементов из массива Y.
3) Сложение этих массивов (совмещение) в массив Z.
4) Вычисление суммы четырехзначных элементов массива Z.

Также хочется дополнить, что для 4-ой задачи я беру в random от -10000 до 10000 (включая оба значения). (Возможно, что неверно)

Считает-то оно правильно, даже очень, но ошибка, информации о которой в интернете не так много, меня напрягает.
*** stack smashing detected ***: ./2 terminated
Aborted (core dumped)

Сам код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <limits.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
//--------------------------------------------------------------//
 
void naib5(int g, long long int y[],long long int *y2,int con)
{
    for (int i=0;i<g;i++)
    {
        int num=0;
    while(num!=con)
    {
        if (y[i]>y2[num])
          swap(y[i],y2[num]);
          num++;
      
  }}}
//--------------------------------------------------------------//
long long int summ4(int l,long long int a[])
{
    long long int k=0;
     for(int i=0;i<l;i++)
     {
         if (a[i]/1000>1 and a[i]/1000<10) 
         k+=a[i];
     }
 return k;
}
 
    
//--------------------------------------------------------------//
int main()
{
    int n,g,m=0;
    const int con=5;
    const int gran=10000;
    srand(time(0));
    cout<<"Количество чисел в 1 массиве"<<endl;
    cin>>n;
    cout<<"КОличество чисел во 2 массиве"<<endl;
    cin>>g;
    long long int y[g],y2[con],x[n],x2[n];
    for(int i=0; i<n;i++)
    {
        x[i]=random()%(2*gran)-gran+1;
        if (x[i]>0) 
        {
            x2[m]=x[i];
            m++;
        }
    }
    for(int i=0;i<g;i++)
    {
        y[i]=random()%(2*gran)-gran+1;
        y2[i]=-gran-1;
    }
    naib5(g,y,y2,con);
    long long int z[con+m-1];
    for(int i=0;i<con+m-1;i++)
         if (i<con) z[i]=y2[i];
         else z[i]=x2[i-con];
      cout<<"Сумма четырехзначных чисел = "<<summ4((m+con-1),z)<<endl;
      return 0;
  }
Дополнительно хочется узнать, почему при использовании random я получаю трехзначных и четырехзначные числа? Практически не встречаю однозначных и двузначных чисел. Понимаю, что вся завязка идет на тайминге, но как-то мне этот процесс непонятен.

И хочется сразу сказать. Мне известно, что подобные типы задач лучше решать с помощью динамических массивов, однако хочется попробовать и с помощью статических.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2018, 16:01
Ответы с готовыми решениями:

Stack smashing detected. Ребята, перемешка данных, что не так?
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int...

*** stack smashing detected ***: <unknown> terminated, программа завершает работу на цикле
Здравствуйте! Пробую сделать программу, которая заполняет массив случайными числами от 10 до 100 и...

Ошибка: "Unhandled exception: Stack cookie instrumentation code detected a stack-based buffer overrun"
Не могу понять почему значение ChoiceOfPlayer меняется и почему NumberOfRow и NumberOfColumn всегда...

stack smashing detected
Пишу приложение в qt. После того, как оно отрабатывает, на самой последней строке, закрывающей...

6
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
02.04.2018, 09:41 2
Ошибка всегда появляется или в зависимости от введённых чисел? Какой компилятор?

Вероятно где-то есть выход за границы массива.
Ещё, возможно, массивы слишком длинные и не умещаются в стеке. В этом случае есть смысл использовать динамические массивы или std::vector с проверкой выхода индекса.
0
0 / 0 / 1
Регистрация: 25.03.2018
Сообщений: 16
02.04.2018, 09:49  [ТС] 3
likehood,
1) Ошибка появляется ВСЕГДА.
2) Компилятор GCC под Linux.
3) Выхода за границы массива не замечал. Единственное, что меня пугает, так это наличие остаточной информации в ячейках, например: 1247124124. Понятное дело, что эта информация из оперативной памяти, однако вообще её наличие меня пугает... Мне казалось, что ячейки должны обнуляться.
4) Массивы не столь велики. 12-15 ячеек, которые я определяю в самом начале. Или Вы имеете ввиду что-то другое?
5) Про динамические массивы я уже писал. Чуть позже с ними ознакомлюсь. Хотелось бы исправить эту ошибку со статическими. А за вектор благодарю. Обязательно ознакомлюсь.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
02.04.2018, 10:01 4
Лучший ответ Сообщение было отмечено Flapch как решение

Решение

Цитата Сообщение от Flapch Посмотреть сообщение
Выхода за границы массива не замечал.
Но это не значит, что его не было.

Можно попробовать задать фиксированные (и достаточно большие) размеры массивов, и посмотреть сохранится ли ошибка. Если пропадёт, значит проблема в этом.

Добавлено через 6 минут
Собственно, язык С++ не поддерживает создание массивов, размер которых задаётся переменной, а не константой. Хотя многие компиляторы (включая gcc) поддерживают такую возможность в качестве нестандартного расширения. Но мой компилятор (mingw) это не поддерживает (по крайней мере по-умолчанию), так что мне пришлось сделать размеры массивов фиксированными, чтобы код скомпилировался. И у меня он работает без ошибок. Правда, это под Windows.
1
0 / 0 / 1
Регистрация: 25.03.2018
Сообщений: 16
02.04.2018, 10:02  [ТС] 5
likehood, каким образом... Сработало.
C++
1
    long long int y[g+25],y2[con+25],x[n+25],x2[n+25];
Как так-то... Спасибо большое, теперь хоть идея для исправления имеется.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
02.04.2018, 10:10 6
Лучший ответ Сообщение было отмечено Flapch как решение

Решение

Цитата Сообщение от Flapch Посмотреть сообщение
y2[con]
con равно 5
Цитата Сообщение от Flapch Посмотреть сообщение
y2[i]=-gran-1;
А здесь выход за границы массива, если g больше 5
1
0 / 0 / 1
Регистрация: 25.03.2018
Сообщений: 16
02.04.2018, 10:39  [ТС] 7
likehood, точно, увидел. Спасибо большое. Решено.
0
02.04.2018, 10:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2018, 10:39
Помогаю со студенческими работами здесь

Getwchar stack smashing detected
Всем привет. Кто сможет объяснить что происходит, вот этот код: #include &lt;locale.h&gt; #include...

[bcc32 Error] File1.cpp(19): E2316 'Stack<T>::Stack()' is not a member of 'Stack<T>'
Возникает ошибка File1.cpp(19): E2316 'Stack&lt;T&gt;::Stack()' is not a member of 'Stack&lt;T&gt;' ...

Массивы. Random
#include &lt;stdio.h&gt; #include &lt;stdlib&gt; #include &lt;conio.h&gt; void main() { int a,n, i,w,...

Двумерные Массивы и random
Дан целочисленный массив В. Найти количество положительных элементов этого массива, расположенных...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru