显式设置指针的值

Explicitly setting the value of a pointer

本文关键字:指针 设置      更新时间:2023-10-16

我正在编写一个mex-file(使用c++),它将接受内存地址作为输入,并对该内存地址的数据进行操作。因为我被迫使用MATLAB作为我的环境,我的程序只能接受MATLAB数据类型作为输入(char, bool, float, double和int)。如何将输入值赋给指针?

伪代码:

// Outside of program
// double input_arg = hex2dec('00C2E4E8')
double *pointer;
pointer = (double *)input_arg;
// pointer == hex2dec('00C2E4E8')
基本上,这可以看作是我硬编码一个指针的值,类似于:
double *pointer = (double *)hex2dec('00C2E4E8');

我收到错误:

错误C2440: '=':不能从'double'转换为'double *'

我也尝试过使用static/const/reinterpret/dynamic_cast,但我真的不明白它们是如何工作的(我不能让它们工作)。是否有可能在所有手动分配内存地址值指针?

似乎你不能使用double,这是一个浮点类型,作为内存中地址的表示,它本质上是一个整数值。

我猜你的input_arg应该被定义为MATLAB int类型,而不是double

你试图做的是危险的,因为你传递了一些c++代码的原始指针,对该位置存在的内容进行了假设,并根据这些假设执行代码。但是假设你已经解决了所有这些安全问题。

您可能希望将指针作为UINT64传递给您的MEX文件(以便代码可以重新编译并像在64位的MATLAB安装上一样使用)。

在MATLAB端:
ptrArg = uint64(hex2dec( '00C2E4E8' ));
myMexFile( ptrArg );

在您的mex函数中:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  if( nrhs < 1 ) {
    // error
  } else {
    // Verify that the address argument is a UINT64 
    if( mxGetClassID( prhs[0] ) != mxUINT64_CLASS ) {
      // error
    }
  }
  // Done with error checking, now perform the cast
  uint64_T mlData = *static_cast<unsigned long long *>( mxGetData( prhs[0] ) );
  double *p = reinterpret_cast<double *>( mlData );
  // Do whatever with p
}

注意:你可以做同样的双,只要改变mxGetClassID检查寻找mxDOUBLE_CLASS。在这种情况下,强制转换表达式变成:

double *p = reinterpret_cast<double *>( *mxGetPr( prhs[0] ) );
编辑:


我所说的要让这段代码在32位或64位机器上工作,只有在两台机器都是小端序的情况下才成立。否则,如果在大端机器上传递64位int型的32位指针并将其强制转换为double *,则会得到一个0x00000000指针。

您可以使用MATLAB函数computer来检测机器的端序问题。如果需要字节交换,可以使用swapbytes。要在c++代码中执行这些函数,请使用mexCallMATLABWithTrap .

尝试:

double *pointer = (double *)0x00C2E4E8;

(添加0 x)

为什么input_arg是double?指针总是某种整数类型。

这可以解决" double到double *的转换"