我收到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)
演员(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.
(就这样你知道.)
笔记:
T用作标识符.它通常用于template类型,任何其他用途都可能导致混淆.1感谢@hvd的贡献!
| 归档时间: |
|
| 查看次数: |
916 次 |
| 最近记录: |