Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2018, 15:52   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Нарушение прав доступа при записи по адресу.

Здравствуйте!
Разбил проблемный код на части. Выявил проблему. Почему то не записывается (как я понял) строка в строковый массив.
Кто может сказать, почему так?
Код:
#include <iostream>
#include<sstream>
#include<fstream>
#include<string>
#include<Windows.h>
#include<conio.h>
#include<ctime>
#include <cstdlib>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

using namespace std;

int main()
{
	setlocale(LC_CTYPE, "rus");
	//Здесь предполагается создание папки, файла "текст", и наполнение этого файла строками со случайными словами
	struct stroka
	{
		string st;
		int count;
	};

	srand(time(0));
	bool random_bool();
	bool prov(char a);
	char ch = ' ';
	int k = 10 +rand() % 11;//количество предложений от 10 до 20
	string* mass_str = new string[k];
	string str1 = "", str2 = "", str3 = ". ";
	for (int i = 0; i < k; i++)
	{
		mass_str[i] = "";//инициализация ячеек массива
	}
	for (int i = 0; i < k; i++)
	{
		//bool p = random_bool();//определение состава предложений: с цифрами или нет
		//if (p == true)// если предложение без чисел 
		//{
			int f = 5 + rand() % 6; // получение рандомом количества слов в предложении f (от 5 до 10).
			for (int i = 0; i < f; i++) // цикл на f итераций ДЛЯ ФОРМИРОВАНИЯ ПРЕДЛОЖЕНИЯ
			{
				int n = 3 + rand() % 6;// получение количества символов в слове (от 3 до 8)
				for (int j = 0; j < n; j++)// создание слова конкатенацией символов к переменной-стрингу
				{
					char ch = char(rand() % 26 + 0x61); // рандом создающий символ
					str1 += ch; // конкатенация символа
					if (j == (n - 1) && i == (f - 1))
					{
						str1 += str3;//то добавляется точка и пробел
					}
					else
					{
						if (j == (n - 1))//если последний символ в слове
						{
							ch = ' ';
							str1 += ch;//то добавляется пробел
						}
					}
				}
				str2 += str1;//ДОБАВЛЕНИЕ БУКВЕННОГО СЛОВА В СТРОКУ
				str1 = "";
			}
			cout << str2 << endl;
			mass_str[k] = str2; //вставка предложения в массив.
			//cout << mass_str[k];
	//	}
		//конец условия по созданию предложений без чисел
	}
	/*for (int i = 0; i < k; i++)
	{
		cout << mass_str[i]<<endl;
	}*/
	_getch();
	return 0;
}
/////////////////////////////////////////////////////////////////

bool random_bool()
{
	bool Variable = rand() % 2 == 0;
	return Variable;
}
Изображения
Тип файла: jpg кадр_15.jpg (109.0 Кб, 125 просмотров)
Тип файла: jpg кадр_16.jpg (100.9 Кб, 130 просмотров)
KAMLS вне форума Ответить с цитированием
Старый 10.10.2018, 15:56   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Потому что у массива из k элементов нет элемента с индексом k. Вы же почему то индексируете от 0 до k?..
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 15:58   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Шо, опять?
Вы обращаетесь к уже удаленной памяти.

Ref:
https://stackoverflow.com/questions/...alloc-free-new
waleri вне форума Ответить с цитированием
Старый 10.10.2018, 15:58   #4
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Потому что у массива из k элементов нет элемента с индексом k. Вы же почему то индексируете от 0 до k?..
Я даже не знаю как заматериться..........
Спасибо большое.
KAMLS вне форума Ответить с цитированием
Старый 10.10.2018, 15:59   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вы обращаетесь к уже удаленной памяти.
Нет. Просто вылез за границы. Он вообще память не чистит.
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 16:00   #6
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Там же i надо ставить... *ляяяя........
KAMLS вне форума Ответить с цитированием
Старый 10.10.2018, 16:00   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Нет. Просто вылез за границы. Он вообще память не чистит.
Какие границы?!!! я вместо индекса размер поставил!!!
KAMLS вне форума Ответить с цитированием
Старый 10.10.2018, 16:01   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну да. И вылезли за границы массива.
p51x вне форума Ответить с цитированием
Старый 10.10.2018, 16:04   #9
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну да. И вылезли за границы массива.
Ну так то да.. Но у меня в мозге было что там стоит именно индекс. Я вообще на это не смотрел. Как-то ускользало что это размер а не индекс. Искал везде но не там. Потому что вроде как уж это-то (что там индекс ставить надо) я знаю.)))
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необработанное исключение по адресу 0x012A8F88 в Задачи.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x01020000. Мой повелитель Общие вопросы C/C++ 2 09.01.2016 19:53
Исправить ошибку: необработанное исключение по адресу, нарушение прав доступа при записи по адресу Анастасия_18 Общие вопросы C/C++ 3 16.07.2014 09:57
Mutex нарушение прав доступа при чтении по адресу Eugenelife Помощь студентам 0 15.12.2013 13:13
c++ нарушение прав доступа при чтении по адресу 0x00000000 proef Помощь студентам 7 05.09.2013 23:49