Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
#1

Ошибка (access violation) при обращении к элементу динамического массива структур - C++

07.10.2015, 09:12. Просмотров 322. Ответов 10
Метки нет (Все метки)

Добрый день! Все прекрасно работает если в структуре статические массивы. Но так уж получилось, что есть необходимость задавать размерность массивов вручную. Итак, есть некая структура с динамическим массивом, которую мы объявляем в одной из функций:

C++
1
2
3
4
5
6
7
Struct STR{ 
...
...
int   *Prog;
} rec;
 
rec.Prog=new int[k]; //Значение k получаем ранее, в процессе работы программы.
Далее пытаюсь записать значение этого массива в вариантный массив

C++
1
2
3
4
5
while (!eof(Fdat)){
        read( Fdat,(char *)&rec,sizeof(rec));
for (int i=0;i<k;i++)
 {
                most_prog.PutElement(rec.Prog[i], t, i);
И на последней строке вылетает не к ночи помянутый access violation. По-разному пробовал экспериментировать, пришел к выводу, что дело именно в обращении к элементам динамического массива rec.Prog[i], размерность которого мы вроде как задали ранее. Помогите, пожалуйста. Заранее благодарю. Повторюсь, если структура объявлена со статическими массивами, то проблем нет вообще никаких с этим же кодом.
http://www.cyberforum.ru/cpp-beginners/thread740199.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2015, 09:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка (access violation) при обращении к элементу динамического массива структур (C++):

Обращение к элементу динамического массива структур
Само задание: http://cs412722.vk.me/v412722398/4e77/fUkq93u2HDE.jpg пока...

Ошибка при обращении к элементу вектора
В общем, создаю нейросеть. Есть вектор объектов класса Слой, слой - это вектор...

Ошибка при обращении к элементу строки *s
Помогите, пожалуйста. Задача: описать рекурсивную функцию digits(s) целого...

Ошибка считывания из файла динамического массива структур
Строка таблицы содержит следующую информацию о первокурсниках: фамилия, имя,...

Ошибка Access Violation при записи
void Texts :: setC_String() { str=strb; str-&gt;setC_String();//здесь...

10
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,024
Завершенные тесты: 1
07.10.2015, 09:30 #2
А что тебе мешает обьявить сразу динамический массив в структуре

Добавлено через 3 минуты
C++
1
2
3
4
for (int i=0;i<k;i++)
{
rec.Prog[i]=new int[k];
}
Так пробовал
0
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 09:49  [ТС] #3
Цитата Сообщение от Игорь1986 Посмотреть сообщение
А что тебе мешает обьявить сразу динамический массив в структуре
Добавлено через 3 минуты
Код C++Выделить код
1
2
3
4
for (int i=0;i<k;i++)
{
rec.Prog[i]=new int[k];
}
Так пробовал
Я правильно понимаю, что это вместо 7 строки в моей первой вставке? Если да, то ругается cannot convert 'int*' to 'int'
0
Operok
174 / 172 / 64
Регистрация: 15.02.2015
Сообщений: 496
Завершенные тесты: 2
07.10.2015, 09:53 #4
Jaydens_Blues, вы записываете в файл структуру, содержащую указатель (это просто адрес памяти в куче), сам массив, как лежал в куче, так там и будет лежать, пока эту память не отметят как неиспользуемую (что неминуемо произойдёт при завершении работы программы). Когда вы читаете структуру, то в ней находится адрес, по которому уже нет массива (при этом и куча скорее всего уже другая), разыменовывание (rec.Prog[i]) такого указателя и приводит к "access violation". Для записи структуры в файл используйте либо статический массив, либо как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct STR
{
    ...
    size_t count;
} rec_for_write, rec_for_read;
...
rec_for_write.count = k;
int* Prog_for_write = new int[rec.count];
...
write(Fdat, (char*)&rec_for_write, sizeof(STR));
write(Fdat, (char*)Prog_for_write, rec_for_write.count*sizeof(int));
...
read(Fdata, (char*)&rec_for_read, sizeof(STR));
int* Prog_for_read = new int[rec_for_read.count];
read(Fdata, (char*)Prog_for_read, rec_for_read.count*sizeof(int));
//работаем с Prog_for_read
0
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:01  [ТС] #5
Цитата Сообщение от Operok Посмотреть сообщение
aydens_Blues, вы записываете в файл структуру, содержащую указатель (это просто адрес памяти в куче), сам массив, как лежал в куче, так там и будет лежать, пока эту память не отметят как неиспользуемую (что неминуемо произойдёт при завершении работы программы). Когда вы читаете структуру, то в ней находится адрес, по которому уже нет массива (при этом и куча скорее всего уже другая), разыменовывание (rec.Prog[i]) такого указателя и приводит к "access violation". Для записи структуры в файл используйте либо статический массив, либо как-то так
У меня наоборот, я считываю файл в структуру. Но, как я понимаю, это без разницы. Наверное, все же придется работать со статическими массивами, т.к. помимо этой одной ошибки почему-то файл читается как-то по-другому, не как со статическими. Это еще как-то и на размер структуры sizeof(rec) влияет, потому что файл будто дольше читается, чем положено и, возможно, некорректно
0
Operok
174 / 172 / 64
Регистрация: 15.02.2015
Сообщений: 496
Завершенные тесты: 2
07.10.2015, 10:06 #6
Jaydens_Blues, а пишет туда эти структуры кто? Если в структуре объявить статический массив, то он её размер станет больше ровно на sizeof("тип_эл_массив")*count, в вашем случае (динамический массив) в структуре лежит просто указатель, который имеет актуальность только в том процессе, в котором его инициализировали (выделили память под него).
0
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,024
Завершенные тесты: 1
07.10.2015, 10:08 #7
Насчет ошибки обьяви вот так и все должно работать int Prog;
Мучайся с динамическими, так интереснее
0
Operok
174 / 172 / 64
Регистрация: 15.02.2015
Сообщений: 496
Завершенные тесты: 2
07.10.2015, 10:13 #8
Если это файл с данными типа:
C++
1
2
3
4
5
6
struct STR
{
    ...
    int k; //кол-во данных
    int Prog[k];  //данные
}
то лучше будет считывать либо побайтно, либо как я предложил, тогда лучше будет объявить структуру:
C++
1
2
3
4
5
struct STR_for_read
{
    ...
    int k;
}
читать её, узнавать кол-во данных и читать данные в динамический массив (они будут лежать в файле ровно за структурой STR_for_read)
0
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:14  [ТС] #9
Цитата Сообщение от Игорь1986 Посмотреть сообщение
Насчет ошибки обьяви вот так и все должно работать int Prog;
Мучайся с динамическими, так интереснее
Ну, так это же будет просто переменная, если просто int Prog
0
Игорь1986
121 / 114 / 57
Регистрация: 08.09.2014
Сообщений: 1,024
Завершенные тесты: 1
07.10.2015, 10:34 #10
C++
1
rec.Prog[i]=new int*[k];
)))Бывает
Радует что вы хоть немного думаете а не сдираете с копирки
0
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
07.10.2015, 10:54  [ТС] #11
Игорь1986, да не, все равно не то, cannot convert 'int**' to 'int'. Ну и в целом, как я понимаю, этот код пытается в элемент массива запихнуть другой массив... Или я не прав? Какова суть фрагмента кода, который вы хотели предложить с самого начала?
Ведь изначально 7 строка (rec.Prog=new int[k]) и устанавливает размерность массива, то есть если k=10, то получится типа как при объявлении статического int Prog[10], вот только дальше уже фигушки работать как со статическим...
0
07.10.2015, 10:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2015, 10:54
Привет! Вот еще темы с решениями:

Ошибка Access violation при передаче указателя в функцию
выделяю память для нужд програмных и соханяю его. char *resadres =(char*)...

Access violation при выводе массива через функцию
Приветствую вас, прошу помощи в объяснении что же не так.(В частности проблема...

Ошибка при обращении к элементам массива
Задано массив А размера N. Сформировать новый массив B того же размера,...

Ошибка "Access violation writing location" при работе с массивом.
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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