访问冲突读取位置0x0000000000000001

Cag*_*gri -2 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");
Run Code Online (Sandbox Code Playgroud)

cad*_*luk 8

演员(double*) data投出了屈服的价值.你显然希望地址的,虽然.data1data

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

来自man memcpy:

void *memcpy(void *dest, const void *src, size_t n);
Run Code Online (Sandbox Code Playgroud)

如你所见,memcpy需要void*指针,所以这里的铸造是超级的.void*无论如何,指针最终都会结束.
因此,只需写

&data
Run Code Online (Sandbox Code Playgroud)

代替.

请注意,这可能会导致未定义的行为; 你确定Short并且double具有相同的尺寸和对齐属性吗?
此外,无论您是否意识到这一点,使用memcpy此处可以避免违反严格别名规则.你应该知道

src = *static_cast<double*>(&data);
Run Code Online (Sandbox Code Playgroud)

如果Short不相同,则是未定义的行为double.
(就这样你知道.)


笔记:

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

1感谢@hvd的贡献!