如何从无符号长到无效*?

时间:2011-08-01 00:08:04

标签: c++ file-io casting

我试图在具有给定文件描述符的文件的某个偏移量处pwrite一些数据。我的数据存储在两个向量中。一个包含unsigned long s和另一个char s。

我想要构建一个void *,指向代表我的unsigned longchar s的位序列,并将其与累计大小一起传递给pwrite。但是,如何将unsigned long投射到void*? (我想我可以找出字符然后)。这是我正在尝试做的事情:

void writeBlock(int fd, int blockSize, unsigned long offset){
  void* buf = malloc(blockSize);
  // here I should be trying to build buf out of vul and vc
  // where vul and vc are my unsigned long and char vectors, respectively.
  pwrite(fd, buf, blockSize, offset);
  free(buf);
}

另外,如果您认为我的上述想法不好,我会很乐意阅读建议。

4 个答案:

答案 0 :(得分:6)

你不能有意义地将unsigned long投射到void *。前者是数值;后者是未指定数据的地址。大多数系统将指针实现为具有特殊类型的整数(包括您在日常工作中可能遇到的任何系统),但这些类型之间的实际转换被认为是有害的。

如果您要执行的操作是将unsigned int的值写入文件描述符,则应使用&运算符获取值的地址

unsigned int *addressOfMyIntegerValue = &myIntegerValue;
pwrite(fd, addressOfMyIntegerValue, sizeof(unsigned int), ...);

你可以遍历你的矢量或数组,并用它逐个编写。或者,使用std::vector的连续内存功能整体编写它们可能会更快:

std::vector<unsigned int> myVector = ...;
unsigned int *allMyIntegers = &myVector[0];
pwrite(fd, allMyIntegers, sizeof(unsigned int) * myVector.size(), ...);

答案 1 :(得分:3)

unsigned long i;
void* p = (void*)&i;

答案 2 :(得分:2)

可以使用以下代码进行投射:

unsigned long my_long;
pwrite(fd, (void*)&my_long, ...);

答案 3 :(得分:1)

像这样:

std::vector<unsigned long> v1;
std::vector<char>          v2;

void * p1 = reinterpret_cast<void*>(&v1[0]);
void * p2 = reinterpret_cast<void*>(&v2[0]);

写下尺寸v1.size() * sizeof(unsigned long)v2.size()