Lekshmi KR Ответов: 3

Необработанное исключение: нарушение доступа место записи 0x00000000


I am doing a simple application to define a structure and place data in tha structure to learn the concept of structures. But when trying to insert data to structure i am getting an access violation. Following is the code portions.


In Test.h file


<pre lang="C++">typedef struct Msg
{
unsigned char*   message_id;
unsigned char*   message_name;
}Msg_t; 


In Test.cpp file



Msg_t *new_node[10];

const char *src = "E0";
new_node[0]->message_id = (unsigned char *)_strdup(src); //getting access violation error here.


Я совершенно новичок в этой среде.. Почему я получаю эту ошибку?
Помогите..

3 Ответов

Рейтинг:
26

CPallini

Цитата:
Msg_t *new_node[10];
В приведенной выше строке создается массив из 10 указателей. Хорошо.


Цитата:
new_node[0]->message_id = ...
Для того чтобы сделать вышеуказанную линию работающей, new_node[0] должен указывать на действительный Msg_t экземпляр в то время как он указывает на мусор.

Вы должны написать что-то вроде
new_node[0] = new Msg_t();

прежде чем разыменование new_node[0].


Kornfeld Eliyahu Peter

Просто добавлю, что при запуске из IDE (Visual Studio) все указатели инициализируются до 0, где в реальной среде выполнения это будет настоящий мусор...
+5

CPallini

Спасибо.

Lekshmi KR

Я инициализировал, как вы мне сказали, и получил его отлично работающим.. Большое вам спасибо за помощь

CPallini

Добро пожаловать. Не забудьте удалить любой новый объект:
https://en.wikipedia.org/wiki/New_and_delete_(в%2Б%2В)

Lekshmi KR

Да, конечно.. Я удалил его после использования.

Sergey Alexandrovich Kryukov

5ед.
—СА

CPallini

Спасибо.

Рейтинг:
2

OriginalGriff

Это обычная проблема, и мгновенная мысль скажет вам, в чем проблема.
Посмотрите на адрес, на который он жалуется: "0x00000000" - или "ноль", как его еще называют. Насколько вероятно, что все, что вам нужно использовать, будет расположено по первому возможному адресу в памяти? Абсолютно не вероятно!

Поэтому используйте отладчик и выясните, почему он равен нулю, а это значит, что нужно точно определить, какой бит равен нулю.
Я предполагаю, что это ваш new_node массив не инициализирован, поэтому он содержит нули - но только вы можете подтвердить это, так как мы не можем запустить ваш код!
Когда вы это знаете, вы можете узнать, почему он равен нулю - вероятно, потому, что вы не выполнили код, чтобы фактически вставить его Msg_t элементы в него...


Рейтинг:
0

StephenJElliott

Возможно, попробуйте изолировать ошибку вплоть до самого маленького фрагмента, который мог бы создать ошибку; например, если Test.cpp код есть:

Msg_t *new_node[10];
 
const char *src = "E0";
_strdup(src); //getting access violation error here?


Вы все еще получаете сообщение об ошибке здесь?

Или, если это сработает, как насчет этого здесь? Это нормально компилируется?

Msg_t *new_node[10];
 
const char *src = "E0";

unsigned char *testresult;

testresult = (unsigned char *) _strdup(src); //getting access violation error here??



Кроме того, вы можете найти здесь некоторую документацию _strdup, _wcsdup, _mbsdup для _strdup.

Похоже, что он уже возвращается (char*), и, возможно, вы могли бы просто настроить структуру, чтобы она соответствовала тому, что она возвращает.

Явно, если структура изменена на:

typedef struct Msg
{
char   *message_id;
char   *message_name;
}Msg_t;


тогда возникает ли та же проблема?