访问冲突读取位置0x0000000000000001

时间:2016-02-26 13:54:36

标签: c

我收到access violation reading location 0x0000000000000001错误,该错误在memcpy( src, (double*) data, sizeof(double) );函数中中断。有人可以帮帮我吗?请注意,mx函数与c。

中的MATLAB相关

请注意,数据应为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");

2 个答案:

答案 0 :(得分:8)

广播(double*) data投射data,产生1。不过,你显然想要data地址

毕竟,你根本不需要演员。 1 memcpy并不关心类型;它只需要指针和内存大小来确定要复制的内存量。

来自man memcpy

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

如您所见,memcpy需要void*个指针,因此此处的投射是超级的。无论如何,指针结尾为void* 因此,请写下

&data

代替。

注意但这可能会导致未定义的行为;您确定Shortdouble具有相同的大小和对齐属性吗? 此外,无论您是否意识到这一点,在此使用memcpy可以避免违反严格别名规则。你应该知道

src = *static_cast<double*>(&data);
如果Shortdouble不同,则

是未定义的行为 (就这样你知道。)

注意:

  • 你的代码看起来很C-ish。当然是它的C ++?
  • 如果它真的是C ++,请不要使用T作为标识符。它通常用于template类型,任何其他用途都可能导致混淆。

1 感谢@hvd的贡献!

答案 1 :(得分:2)

man memcpy会告诉你预期的第一个参数是目的地。再加上你的演员错了:

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