这段代码发生了什么?的reinterpret_cast <INT *>(BUF)

时间:2018-02-08 23:14:12

标签: c++

在我看来,缓冲区正在被修改。它是否将6个整数和5个浮点数放入缓冲区?他们将大小设置为44而不是1024 * sizeof(char)也很奇怪。也许整个缓冲区传递给write()但write()只将前44个字节写入客户端。

请您逐行解释一下吗?我没有使用c ++的经验。

char buf[1024];
int* pInt = reinterpret_cast<int*>(buf);
*pInt = 5;
*(pInt+1) = 2;
*(pInt+2) = 3;  
*(pInt+3) = 4;
*(pInt+4) = 5;
*(pInt+5) = 6;

float* pFloat = reinterpret_cast<float*>(pInt+6);
*pFloat = 111;
*(pFloat+1) = 222;
*(pFloat+2) = 333;
*(pFloat+3) = 444;
*(pFloat+4) = 555;

int n;
int size = (1+2*5)*4;
n = write(buf, size);

1 个答案:

答案 0 :(得分:6)

  

它是否将6个整数和5个浮点数放入缓冲区?

  

他们将尺寸设置为11而不是1024*sizeof(char)

,这也很奇怪

他们不想写整个缓冲区。你想只写出写入缓冲区的intfloat

FWIW,这是一个写得不好的代码。它假设sizeof(int)sizeof(float)都等于4.更便携的方法会使用:

int size = 6*sizeof(int) + 5*sizeof(float);

<强>注意

即使发布的代码可能在某些情况下(可能是大多数情况下)工作,也可以使用

int* pInt = reinterpret_cast<int*>(buf);
*pInt = 5;

是标准未定义行为的原因。它违反了严格的别名规则。在该位置没有int开始。

你曾经使用过:

int array[5] = {};
char* cp = reinterpret_cast<char*>(array);

// ...

int* iptr = reinterpret_cast<int*>(cp);
*iptr = 10;

因为cp指向一个int开头的地方,所以没有问题。

对于您的使用案例,最好使用:

char buf[1024];
int intArray[] = {5, 2, 3, 4, 5, 6};
std::memcpy(buff, intArray, sizeof(intArray));

float floatArray = {111, 222, 333, 444, 555};
std::memcpy(buff+sizeof(intArray), floatArray, sizeof(floatArray));

int n;
int size = sizeof(intArray) + sizeof(floatArray);
n = write(buf, size);

进一步阅读:

  1. reinterpret_cast creating a trivially default-constructible object
  2. Unions and type-punning