我收到access violation reading location 0x0000000000000001
错误,该错误在memcpy( src, (double*) data, sizeof(double) );
函数中中断。有人可以帮帮我吗?请注意,mx函数与c。
请注意,数据应为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");
答案 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
代替。
注意但这可能会导致未定义的行为;您确定Short
和double
具有相同的大小和对齐属性吗?
此外,无论您是否意识到这一点,在此使用memcpy
可以避免违反严格别名规则。你应该知道
src = *static_cast<double*>(&data);
如果Short
与double
不同,则是未定义的行为 (就这样你知道。)
注意:
T
作为标识符。它通常用于template
类型,任何其他用途都可能导致混淆。1 感谢@hvd的贡献!
答案 1 :(得分:2)
man memcpy会告诉你预期的第一个参数是目的地。再加上你的演员错了:
memcpy( &data, src, sizeof(double) );