在我看来,缓冲区正在被修改。它是否将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);
答案 0 :(得分:6)
它是否将6个整数和5个浮点数放入缓冲区?
是
他们将尺寸设置为
,这也很奇怪11
而不是1024*sizeof(char)
他们不想写整个缓冲区。你想只写出写入缓冲区的int
和float
。
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);
进一步阅读: