2016-02-26 4 views
-2

Я принимаю access violation reading location 0x0000000000000001 Ошибка, которая ломается в функции memcpy( src, (double*) data, sizeof(double));. Может ли кто-нибудь помочь мне в этом? Обратите внимание, что функции mx связаны с MATLAB в c.нарушение доступа к считыванию местоположения 0x0000000000000001

Обратите внимание, что данные должны быть Short

Вот часть моего кода ...

Engine *ep; 
mxArray *T = NULL; 
double *src; 
Short data = { 1 }; 

src = mxGetPr(T); 

memcpy( src, (double*) data, sizeof(double)); 

if (!(ep = engOpen(NULL))) 
{ 
    exit(-1); 
} 

T = mxCreateDoubleMatrix(1, 1, mxREAL); 

src = mxGetPr(T); 

memcpy( src, (double*) data, sizeof(double)); 

engPutVariable(ep, "T", T); 
engEvalString(ep, "T"); 
+1

Мне очень не совсем понятно, что вы хотите этот код делать. Избежать нарушения прав доступа тривиально. Сделать это на самом деле делать то, что вы хотите, зависит от того, что вы хотите. Вызов 'mxGetPr (T)', когда 'T == NULL' выглядит очень подозрительно. Что это должно делать? – hvd

+0

Нет языка C/C++. Удаление тега C++. – fuz

ответ

8

Актерский (double*) data бросает значение из data, дающую 1. Вы, очевидно, хотите, чтобы адрес от data.

В конце концов, вам вообще не нужен актерский состав. memcpy не заботится о типах; все, что ему нужно, это указатели и размеры памяти, чтобы определить объем памяти, который нужно скопировать.

От man memcpy:

void *memcpy(void *dest, const void *src, size_t n); 

Как вы видите, memcpy принимает void* указатели, так что отливка superflous здесь. В любом случае указатели будут в конечном итоге void*.
Поэтому просто написать

&data 

вместо этого.

Примечание это может привести к неопределенному поведению; вы уверены, что Short и double имеют одинаковый размер и свойства выравнивания?
Кроме того, знаете ли вы об этом или нет, используя memcpy, это избавит вас от нарушения правила строгого сглаживания. Вы должны знать, что

src = *static_cast<double*>(&data); 

не определено поведение, если Short не то же самое, как double.
(Просто так, что вы знаете.)


Примечания:

  • Ваш код выглядит очень C-иш. Уверен, что это C++?
  • В случае, если это действительно C++, не используйте T в качестве идентификатора. Он обычно используется для типов template, и любое другое использование может привести к путанице.

Благодаря @hvd за ваш вклад!

+0

Привет, Спасибо @cad. Но на этот раз T - -9.2560e + 61 вместо значения 1 – Cagri

+1

@cad. Не записывайте кастом вообще, если это бессмысленно и рискует ввести еще больше ошибок. Обычных '& data' было бы достаточно, если' memcpy' вообще нужен (но на основе комментария Cagri это может и не быть, немного сложно следовать коду). – hvd

+0

Теперь код работает хорошо, но значение неверно. T is -9.2560e + 61 вместо 1 – Cagri

2

man memcpy научил вас первому ожидаемому аргументу адресату.Плюс ваше литье неверно:

memcpy(&data, src, sizeof(double)); 
Смежные вопросы