Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
1

Run-Time Check Failure #2 - Stack around the variable 'fish2' was corrupted

12.05.2019, 22:15. Показов 2536. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
while (str1[size1] != '\0') {
        str1[size1] = ' ';
        size1++;
    }
Вот часть кода. Этот цикл должен найти длину строки и заполнить его пробелами. Но проблема в том что из-за строки "str1[size1] = ' ';" видает исключение в конце программы "Run-Time Check Failure #2 - Stack around the variable 'fish2' was corrupted.". Также если смотреть в переменную size1, в ней постоянно число около 300 (что намного больше чем должно быть в программе). В чём проблема? Кажется этот цикл сначала убирает '\0' а потом идёт заново. Если это так, то почему?
При этом программа работает правильно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2019, 22:15
Ответы с готовыми решениями:

Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted
Добрый день, уважаемые представители форума. При решении простейшей задачи возникла такая ошибка:...

Run-Time Check Failure #2 - Stack around the variable 'A' was corrupted
Определить класс вектор (одномерный числовой массив). В класс включить конструктор для определения...

Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted
При вводе значение более трёх символов (это значение конечно можно регулировать) появляется...

Run-Time Check Failure #2 - Stack around the variable '.' was corrupted
Сделал "меню" для работы со своим стеком. При вводе "0" выходит ошибка "Run-Time Check Failure #2 -...

23
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 22:21 2
C++
1
2
3
4
5
size_t pos = 0;
while (str1[pos] != '\0') {
        str1[pos] = ' ';
        pos++;
    }
1
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 22:27  [ТС] 3
zayats80888, ошибка не пропала. Это не помогает.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2019, 22:35 4
Цитата Сообщение от kriks_ Посмотреть сообщение
zayats80888, ошибка не пропала. Это не помогает.
Очевидно, что проблема не в этом цикле. Покажи весь код.
1
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 22:41  [ТС] 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void strcpy_k(char str1[], const char str2[]) {
 
    int size1 = 0;
    int size2 = 0;
 
    while (str1[size1] != '\0') {
        str1[size1] = ' ';
        size1++;
    }
 
    while (str2[size2] != '\0') {
        size2++;
    }
 
    for (int i = 0; i < size2; i++) {
        str1[i] = str2[i];
    }
 
    str1[size2] = '\0';
    std::cout << size1 << "\t" << size2 << "\n";
}
Вот. Но я проверял. Когда убирал строку "str1[size1] = ' ';" всё работало без ошибок. Как я знаю, это исключение может быть из-за выхода за границу массива. Скорее всего это так. Ведь у меня в переменной size1 всегда выходит около 300 (а должно 4). А эта переменная меняется только в этом цикле.
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 22:50 6
во первых
C++
1
2
3
4
    int min = (size1 < size2) ? size1 : size2;
    for (int i = 0; i < min; i++) {
        str1[i] = str2[i];
    }
во вторых, зачем пробелами заполнять?
в третьих, вы уверены что в функцию передаются корректные строки? (c '\0' в конце)
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2019, 22:57 7
Цитата Сообщение от kriks_ Посмотреть сообщение
Вот. Но я проверял. Когда убирал строку "str1[size1] = ' ';" всё работало без ошибок.
Значит ошибка ещё выше.

А вообще, строка копируется обычно в неинициализированный буфер (скорее всего у тебя так и есть). Т.е. поиск нуля в str1 - абсолютно бессмысленная вещь - он будет пробегать всю доступную память пока случайно не встретится ноль.

Покажи остальной код.
1
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 23:01  [ТС] 8
zayats80888
1. Это не работает (скрин ниже).
2. Чтоб когда первая строка была больше чем вторая, не оставалось лишних символов.
3. Да. Ведь всё работает нормально. Просто у меня постоянно это исключение.
Миниатюры
Run-Time Check Failure #2 - Stack around the variable 'fish2' was corrupted  
0
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 23:05  [ТС] 9
oleg-m1973, там есть ноль. Второй цикл (без заполнения пробелами) работает так как надо. Этот, если без заполнения пробелами, тоже. И вот всё что как-то связано с этими строками:
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
void strcpy_k(char str1[], const char str2[]) {
 
    int size1 = 0;
    int size2 = 0;
 
    while (str1[size1] != '\0') {
        str1[size1] = ' ';
        size1++;
    }
 
    while (str2[size2] != '\0') {
        size2++;
    }
 
    for (int i = 0; i < size2; i++) {
        str1[i] = str2[i];
    }
 
    str1[size2] = '\0';
    std::cout << size1 << "\t" << size2 << "\n"; //для отладки
}
 
class fish {
private:
 
    char clr1[16];
    char clr2[16];
    int size;
 
public:
 
    fish() {}
 
    fish(const char clr1[], const char clr2[], const int size = rand() % 3) {
        strcpy_k(this->clr1, clr1);
        strcpy_k(this->clr2, clr2);
        this->size = size;
    }
 
    void print_data() {
        std::cout << "clr1 = " << clr1 << "\t" << "clr2 = " << clr2 << "\t" << "size = " << size << "\n";
    }
 
};
 
int main() {
    srand(time(NULL));
    
    fish fish1("red", "blue");
    fish fish2("white", "yelow", 2);
 
    fish1.print_data();
    fish2.print_data();
 
    return 0;
}
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 23:10 10
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
#include <iostream>
 
void strcpy_k(char str1[], const char str2[]) {
 
    int size1 = 0;
    int size2 = 0;
 
    while (str1[size1] != '\0') {
        //str1[size1] = ' ';
        size1++;
    }
 
    while (str2[size2] != '\0') {
        size2++;
    }
 
    int min = (size1 < size2) ? size1 : size2;
    for (int i = 0; i < min; i++) {
        str1[i] = str2[i];
    }
 
    str1[min] = '\0';
    std::cout << size1 << "\t" << size2 << "\n";
}
 
int main()
{
    char str1[]{"red"};
    const char* str2{ "blue" };
    std::cout << str1 << '\n' << str2 << '\n';
 
    strcpy_k(str1, str2);
    std::cout << str1 << '\n' << str2 << '\n';
}
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2019, 23:17 11
Цитата Сообщение от kriks_ Посмотреть сообщение
oleg-m1973, там есть ноль
Нет, нету. strcpy_k(this->clr1, clr1); в this->clr1 - мусор

Убери этот while (str1[size1] != '\0') { - Он не нужен вообще ни под каким видом
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 23:23 12
так короче
C++
1
2
3
4
void strcpy_k(char str1[], const char str2[]) {
 
    while (*str1 && *str2) *str1++ = *str2++;
}
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2019, 23:24 13
Цитата Сообщение от zayats80888 Посмотреть сообщение
так короче
И не менее бессмысленно. Единственное, что нужно контролировать при копировании строк - это размер выходного буфера, str1. Здесь этого нет.
1
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 23:24  [ТС] 14
zayats80888 и oleg-m1973, спасибо огромное. zayats80888 уже дал рабочий код. oleg-m1973 ожидается, что эту функцию не только для этого класса буду использовать.
Извините если был в каких то моментах слишком глупый. Теорию вроде знаю, а практикуюсь слишком мало, поэтому много туплю.
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 23:30 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Единственное, что нужно контролировать при копировании строк - это размер выходного буфера, str1.
согласен
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
12.05.2019, 23:30 16
Лучший ответ Сообщение было отмечено kriks_ как решение

Решение

Цитата Сообщение от kriks_ Посмотреть сообщение
zayats80888 уже дал рабочий код. oleg-m1973 ожидается, что эту функцию не только для этого класса буду использовать.
Это не рабочий код (как минимум ноль в конце надо добавить). Ещё раз повторяю - в str1 мусор, нельзя полагаться на его содержимое.

Вот классический цикл для копирования строк
C++
1
2
3
4
while (*str2) 
    *(str1++) = *(str2++);
 
*str1 = 0;
1
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 23:33  [ТС] 17
oleg-m1973, спасибо.
0
6105 / 3460 / 1405
Регистрация: 07.02.2019
Сообщений: 8,791
12.05.2019, 23:35 18
Лучший ответ Сообщение было отмечено kriks_ как решение

Решение

так безопаснее:
C++
1
2
3
4
5
void strcpy_k(char* str1, const char* str2, size_t count) {
 
    while (--count && *str2) *str1++ = *str2++;
    *str1 = 0;
}
1
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
12.05.2019, 23:38 19
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
как минимум ноль в конце надо добавить
Цитата Сообщение от zayats80888 Посмотреть сообщение
str1[min] = '\0';
zayats80888, а без этой строки будет работать так ?
C++
1
2
3
int min = (size1 < size2) ? size1 : size2+1;
for (int i = 0; i < min; i++) 
str1[i] = str2[i];
0
-4 / 1 / 0
Регистрация: 24.10.2018
Сообщений: 23
12.05.2019, 23:41  [ТС] 20
zayats80888, oleg-m1973, если есть время, можете объяснить зачем в цикле (*str2)?
0
12.05.2019, 23:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2019, 23:41
Помогаю со студенческими работами здесь

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.
Здравствуйте. Пишу две функции: ввод и вывод целочисленного массива, в конце программы вылетает...

Run-Time Check Failure #2 - Stack around the variable 'C' was corrupted
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { const int n=10;...

Run-Time Check Failure #2 - Stack around the variable 'dt' was corrupted
Я понимаю что ошибка говорит о том что где-то вышел за диапазон массива, я перепроверил все циклы,...

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
Добрый день подскажите что это означает и как исправить данное сообщение Run-Time Check Failure #2...


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

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