Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 便携式内存搜索函数的返回类型_C++_Pointers_Portability - Fatal编程技术网

C++ 便携式内存搜索函数的返回类型

C++ 便携式内存搜索函数的返回类型,c++,pointers,portability,C++,Pointers,Portability,我想写一个便携式内存搜索功能。签名与此类似: return_type FindPattern(uintptr_t start, size_t length, const unsigned char* pattern, const char* mask); 该函数从地址start开始扫描当前进程内存,查找下一个长度字节,并返回与给定模式匹配的第一个字节序列的第一个字节的地址以及给定的掩码。如果找不到模式,函数应该以某种方式指示这一点,可能是通过一个特殊的返回值。主要问题是,在某些平台上,空指针可

我想写一个便携式内存搜索功能。签名与此类似:

return_type FindPattern(uintptr_t start, size_t length, const unsigned char* pattern, const char* mask);
该函数从地址
start
开始扫描当前进程内存,查找下一个
长度
字节,并返回与给定
模式匹配的第一个字节序列的第一个字节的地址以及给定的
掩码
。如果找不到模式,函数应该以某种方式指示这一点,可能是通过一个特殊的返回值。主要问题是,在某些平台上,空指针可能不等于0


什么返回类型最适合此任务,以及如何指示是否未找到模式?

首先,我假设您的意思不是让模式和掩码具有不同的类型。因此,只需返回该类型的指针,如果找不到文本
0
,或者如果您有C++11
nullptr
。即使系统的空指针不是全部零位,文字零也保证为空指针。C++中的

< P>,一个范围一般由一对迭代器表示:<代码>[开始,结束)
通常,
查找
搜索
不匹配
,等等……将返回
结束
,以表示不匹配

因此,我建议简单地遵循这些步骤,因为它会立即使您自己的功能对C++用户来说是熟悉的。
也就是说,如果您坚持使用空指针,则使用
0
nullptr
(C++11及更高版本)可移植;编译器将文本
0
转换为目标平台上适合的任何内容。

内存中空指针的物理表示形式可能不是0。但任何返回空指针的符合标准的操作都可以安全地与0或空指针进行比较。您可以返回
start+length
“便携式内存搜索”是一种矛盾修辞。标准C++只允许你访问定义或分配的对象;访问这些对象之外的是未定义的行为。这意味着编写这样的内存搜索非常不可移植,你必须去执行一些特定于平台的假设,比如“此特定指针值不是有效的内存地址,我可以将其用作故障返回码“@IvanMolodetskikh它们是可移植的。调用者有责任不给它们无效的输入。例如,模式是一个字节序列,定义如下:
const unsigned char pattern[]={0xA1,0x56,0x83}
掩码是一个字符串,由指示字节应匹配的字符和指示字节不应匹配的字符组成,如在任何字节中都会传递,例如:
const char mask[]=“x?x"
将要求第一个字节和第三个字节严格匹配,第二个字节可能有任何值。如果在某个平台上我可以访问整个内存,那么应该是什么类型的
end
uintpttr\u t
size\u t
和类似类型将能够只存储最高的指针值,并搜索整个内存你需要给出一个比这个值高一点的值。两者的类型都应该是
void*
。如果你可以访问整个内存,那么使用
last address+1
作为结束值可能是安全的。是的,这会溢出,但是在你预先假定的系统类型上溢出通常是安全的。@Ivanmoldetskikh:问题与此无关h您可以访问多少内存,以及您可以访问的内存段是否可以用
T*
表示。正如前面提到的,由于标准库专门使用
T*
,那么在这样的平台上,标准库本身将被打破。相反,通过采用相同的习惯用法,您的解决方案是可移植的这是标准库本身,还不够吗?