显式设置指针的值
Explicitly setting the value of a pointer
我正在编写一个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 *的转换"
- 将指针设置为"nullptr"并不能防止双重删除?
- 聚合初始化,将成员指针设置为同一结构成员
- 错误:为什么"void*"不是指向对象的指针类型,即使指针设置为对象?
- C++ 由于类析构函数中的指针设置为 NULL 而导致的内存泄漏
- C 指针设置为地址,但莫名其妙地指出了程序的不同部分中的不同值
- 删除对象与将指针设置为 null
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- STD :: Sort将数组指针设置为NULL
- 将指针设置为函数的返回值
- 如何从另一个函数指针设置函数指针
- std::unique_ptr 是否在其析构函数中将其基础指针设置为 nullptr?
- Boost Python:指针设置为空
- 如何为头文件中声明的指针设置值
- 移动语义是否只是一个浅层副本并将其他人的指针设置为 null?
- 删除指针并将指针设置为null之间有什么区别
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- 当调用析构函数时,是否可以将指向类实例的指针设置为nullptr
- 将指针设置为双阵列以进行循环
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 如何在 C++ 中将指向 int 数组的指针设置为 NULL