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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
yarigk
0 / 0 / 0
Регистрация: 19.07.2010
Сообщений: 12
#1

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. - C++

08.05.2012, 16:19. Просмотров 3343. Ответов 11
Метки нет (Все метки)

Здравствуйте.
Пишу две функции: ввод и вывод целочисленного массива, в конце программы вылетает такая ошибка, и я уже понял почему(кажется потому что у нас массив длиной 5, а длину должен задавать пользователь), но не знаю как исправить. Текст файла исходного кода и заголовочного файла. Помогите исправить пожалуйста

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 #include <math.h>
 #include <conio.h>
 #include "Function.hpp"
 #define N 5
int main(void)
{ int len;
  int a[N];
   Input_mas(a,len);
  
   Print_mas(a,len);
}
Функции

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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define N 5
 
 
void Input_mas (int *a, int &len)
{
int *i;
printf ("Введи кол-во элементов массива \n");
scanf ("%d", &len);
printf ("Введи элементы массива \n");
for (i = a; i < a + len; i++)
scanf("%5d", i);
}
 
 
 
void Print_mas (int a[], int n)
{
int i;
for (i = 0;i < n; i++)
printf ("%d\n",a[i]);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.05.2012, 16:28     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #2
где то выход за границы
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.05.2012, 18:29     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #3
У меня всё работает нормально. Хотя я сначала немного подправил код. Однако сути это не изменило.
В какой момент вылетает? Успевает вывести введённый массив?

Не по теме:

Зачем подключено столько заголовочных файлов? В Function.hpp ещё и не по разу

Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.05.2012, 18:33     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #4
Цитата Сообщение от elivin Посмотреть сообщение
У меня всё работает нормально.
Т.е. ты вводишь размер массива больше 5 и у тебя всё оК? О_о
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.05.2012, 18:40     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #5
Абсолютно верно. Пардон, не знаю как приклеплять миниатюры: скрин
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.05.2012, 19:22     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #6
Цитата Сообщение от elivin Посмотреть сообщение
Абсолютно верно.
Компилятор без проверки переполнения.

Слегка дополни код и увидишь косяк
C++
1
2
3
4
5
6
7
8
9
10
11
int main(void)
{ int len;
int before = 0;
  int a[N];
int after = 0;
   Input_mas(a,len);
  
   Print_mas(a,len);
 
// тут распечатать before и after
}
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.05.2012, 19:51     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Компилятор без проверки переполнения.
Слегка дополни код и увидишь косяк
Не знаю, входит ли в функции -Wall проверка переполнения. Ну да, теперь вижу в чём проблема. Единственное что приходит в голову в качестве решения проблемы - запрашивать количество элементов перед фызовом функции заполнения массива и создавать динамический массив.
Основной файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
#include "Function.hpp"
 
void Input_mas (int *a, int len);
void Print_mas (int *a, int n);
 
int main()
{ 
    int len;
    printf ("Введи кол-во элементов массива \n");
    scanf ("%d", &len);
    int *a = new int[len];
    Input_mas(a, len);
    Print_mas(a,len);
    return 0;
}
Function.hpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio>
 
void Input_mas (int *a, int len)
{
    int *i;
    printf ("Введи элементы массива \n");
    for (i = a; i < a + len; i++)
        scanf("%5d", i);
}
 
 
 
void Print_mas (int *a, int n)
{
    int i;
    for (i = 0;i < n; i++)
        printf ("%d\n",a[i]);
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.05.2012, 20:06     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #8
Цитата Сообщение от elivin Посмотреть сообщение
Wall проверка переполнения.
Конкретно про MSVC если говорить, то wall это только статические проверки, т.е. на этапе компиляции. А тут ошибка периода выполнения. Поищи параметр с названием похожим на "Buffer security check".
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
08.05.2012, 20:17     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Конкретно про MSVC если говорить
Только не VS, а g++ (и gcc естественно). Хотя в нём похоже это тоже только статические проверки. Первая же ссылка гугла советует мне использовать библиотеки типа GNU MP (multi-precision). Однако, мне раньше не приходилось сталкиваться с такого рода ошибками и использовать какие-либо допольнительные библиотеки для проверки считаю излишними. Пожалуй, обойдусь без них.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.05.2012, 07:54     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #10
Цитата Сообщение от elivin Посмотреть сообщение
Только не VS, а g++
Ну я потому и написал "конкретно MSVC", потому что про другие не знаю.)
Только конкретно тут даже не переполнение буфера, а порчу стека проверять нужно. Stack overflow или типа того. Наверняка есть ключ какой-нибудь, хотя бы для дебага.

Цитата Сообщение от elivin Посмотреть сообщение
GNU MP
Гугл не то советует.)

Цитата Сообщение от elivin Посмотреть сообщение
использовать какие-либо допольнительные библиотеки для проверки считаю излишними.
Если компилятор не в состоянии выполнять базовые run-time проверки, то нужно или более новую версию ставить, или плагины или другой компилятор. Чтобы потом не было утверждений:
Цитата Сообщение от elivin Посмотреть сообщение
У меня всё работает нормально.
Но я на 100% уверен, что в gcc есть для этих проверок ключик, иначе бы он скачивался сразу с бубном, мылом и верёвкой. Табуретку нужно скачать отдельно, в зависимости от длины верёвки.
А потом, застрелиться всем этим в ногу.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
09.05.2012, 10:42     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #11
Цитата Сообщение от elivin Посмотреть сообщение
Первая же ссылка гугла советует мне использовать библиотеки типа GNU MP (multi-precision).
Это вообще другое.
Под линухом можно valgrind использовать. А run-time проверки программу замедляют, поэтому не используются. Хотя, возможно, их можно включить каким-нибудь ключом.
UPD: Ключик и правда есть, но только для джавы и фортрана.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 10:56     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
Еще ссылки по теме:
Run-Time Check Failure #2 - Stack around the variable 'gunpowder' was corrupted C++
Run-Time Check Failure #2 - Stack around the variable 'hexStr' was corrupted C++
C++ Run-Time Check Failure #2 - Stack around the variable 'flag' was corrupted
C++ Run-Time Check Failure #2 - Stack around the variable 'buf2' was corrupted
C++ Ошибка Run-Time Check Failure #2 - Stack around the variable 'B' was corrupted

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.05.2012, 10:56     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. #12
Цитата Сообщение от diagon Посмотреть сообщение
run-time проверки программу замедляют
Да это всё миф.) Тем более, если в дебаге.)))
Yandex
Объявления
09.05.2012, 10:56     Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru