Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
Ask
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 16
1

Нарушение прав доступа при записи

20.10.2011, 02:06. Просмотров 4334. Ответов 4
Метки нет (Все метки)

Здравствуйте!
Я новичок на вашем форуме, буду рад различного рода советам, относящимся к нему.

Моя задача: дан файл с кодировками ошибок в формате
<заголовок>
1 : ошибка в простом типе
2 : должно идти имя
3 : должно быть служебное слово PROGRAM
...

Мне нужно всего лишь создать массив строк, в котором будут храниться расшифровки ошибок (индекс массива - код ошибки). Но при запуске прога ложится с сообщением отладчика:

Необработанное исключение в "0x5a0cd2e9 (msvcr100d.dll)" в "Модуль ВВ.exe": 0xC0000005: Нарушение прав доступа при записи "0x012958b0".

Код программы (работаю в Visual Studio 2010):

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
// Модуль ВВ.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "string.h"
#include <stdlib.h>
 
#define MAX 80
#define CodesAmount 334 //всего кодировок +1
#define ERR "Err.msg"
 
void CreateErrorsArray(char *name, char *String[])
{
    FILE *f;
    char message[MAX];
    int i;
    
    for (i = 0; i<CodesAmount; i++) //[0..333]
    {
        String[i] = new char [MAX]; //выделяем память
        String[i] = "No such message..."; //инициализируем сначала так
//т.к. некоторые интервалы расшифровок могут отсутствовать. Если расшифровки нет - в
//соответствующий элемент массива пойдет указанная строка
    }
    
    f = fopen(name,"r");
        
    fgets(message, MAX, f); //пропускаем строку заголовка
    int code;
    while (!feof(f))
    {
        fscanf(f, "%4d", &code); //читаем код ошибки
        fgetc(f); fgetc(f); fgetc(f); //пропускаем 3 символьных позиции ":  "
        fgets(message, MAX, f); //оставшаяся часть - сообщение об ошибке
        strcpy(String[code], message); //меняем соответствующую коду строку
    }
    
    fclose(f);
}
 
void main()
{
    char *Error[CodesAmount]; //упомянутый массив (указателей)
 
    CreateErrorsArray(ERR, Error);
}
-----------------------------------------------------------------------
Ошибка происходит при попытке копирования с помощью функции strcpy. Не первый день пытаюсь понять что тут у меня не так...
Принципиально, чтобы массив передавался по ссылке и в конечном счете стал доступным из основной программы.
Буду очень благодарен, если сможете пояснить, в чем я ошибся.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 02:06
Ответы с готовыми решениями:

Нарушение прав доступа при записи
Подскажите, пожалуйста, почему при запуске такой программы(она должна в файле подсчитывать...

Нарушение прав доступа при записи
подскажите почему возникает ошибка void ChangeBrightness(HDC hdc, RECT In, RECT Out, DWORD Mode,...

Ошибка: нарушение прав доступа при записи по адресу
Надо написать следующую программу: дан символьный массив из 101 элемента. По спецификации %s...

Нарушение прав доступа при записи по адресу 0x00007430
Подскажите, пожалуйста, почему при выполнении программы появляется Вызвано исключение по адресу...

Нарушение прав доступа при записи (работа с файлами)
вообщем такая проблема (на скринах),если я правильно понял то что то с переменной не так. прощу...

4
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
20.10.2011, 02:33 2
Цитата Сообщение от Ask Посмотреть сообщение
String[i] = "No such message..."; //инициализируем сначала так
уберите эту строчку, скорей всего из-за неё проблемы.

Добавлено через 6 минут
верней вместо неё нужно strcpy использовать
1
Ask
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 16
20.10.2011, 03:36  [ТС] 3
Спасибо, действительно все дело было в этой строчке! Вы меня очень выручили!
Привычка еще с паскаля присваивать строки так...
А то есть в С++ присваивание строк осуществляется только с помощью функций strcpy, gets/fgets?
0
OstapBender
584 / 523 / 75
Регистрация: 22.03.2011
Сообщений: 1,585
20.10.2011, 04:08 4
ну тут важно понимать , что вы хотите сделать.

strcpy копирует из 1 области памяти в другую.
присваивание же просто ставит указатель на другую область памяти.
т.е. строка типа char *s = "qwerty123"; это НЕ копирование в s значения, это просто значит что s теперь указывает на некоторую область памяти (обычно read only) , по которой находится "qwerty123". пытаться писать в эту память - потенциально опасное занятие.

а гетсы - это чтение строки.
0
Ask
0 / 0 / 0
Регистрация: 20.10.2011
Сообщений: 16
20.10.2011, 20:00  [ТС] 5
спасибо за объяснение!
0
20.10.2011, 20:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2011, 20:00

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

Нарушение прав доступа при записи по адресу 0х00000000 при добавлении элемента структуры
прошу помощи, выбивает эту ошибку при добавлении элемента структуры, также приму во внимание другие...

Динамические массивы: Нарушение прав доступа при записи по адресу 0xCCCCCCCC
При запуске возникает ошибка &quot;Нарушение прав доступа при записи по адресу 0xCCCCCCCC&quot;. Помогите...


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

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

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