当定义一个将在内存上操作的函数时,将地址传递为void*或uint8*是否更正确?



大多数现有的运行时内存函数接受或返回void*,这允许在不显式转换指针类型的情况下传递参数。在创建自定义内存函数时是否应该复制此模式?

换句话说,下面哪个更正确,为什么:

int read_bytes( void * dest, size_t count );

int read_bytes( uint8_t * dest, size_t count );

?

我建议使用void*。否则,对函数的每次调用将看起来像:

int n = read_bytes((uint8_t*)&myVar, sizeof(myVar));

而不是

int n = read_bytes(&myVar, sizeof(myVar));

void*是C/c++中的通用指针。在您不希望与数据一起指定特定类型并避免强制转换指针的情况下使用它。它也是您想要用于原始地址的指针。

当你想要指定你真正在处理无符号整数时,你可以使用uint_t。

如果您只将内存视为原始的、不透明的内存,而不是字节序列,那么void *是合适的类型。这可能是惯用的,例如,当使用place -new在内存中创建对象时。还有一些传统的C api使用void指针作为内存引用,比如memcpymemchr,所以偶尔使用相同的类型会很方便。

另一方面,如果你认为内存是一个字节数组,特别是如果你想访问内存中的随机字节(即执行指针或迭代器算术),你绝对应该使用char指针类型。关于哪一个是最好的存在一定的争论;通常,对于I/O,您希望普通的char作为"系统的I/O数据类型"(例如读/写I/O)。另一方面,如果你想操作算术字节值,unsigned char更合适。不过,这两种类型的布局是兼容的,所以如果有必要,可以随意将其中一种视为另一种。

最新更新