gpt4 book ai didi

C++得到指针而不是值

转载 作者:行者123 更新时间:2023-11-28 00:31:47 25 4
gpt4 key购买 nike

我想知道为什么指针值 (324502) 在 var signalLengthDebugVar1 而不是预期的整数值 (2) 中?

struct ShmLengthOfSignalName {
int signalLength;
};
//...
BYTE* pBuf = NULL;
//...
int main(void){
//...
pBuf = (BYTE*) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
//...
JobaSignal sig1;
printf("Value SignalLength: %d \r\n", pBuf[30]); // 2
const ShmLengthOfSignalName * signalNameLengthPtr = (const ShmLengthOfSignalName *)(pBuf + 30);
int signalLengthDebugVar1 = signalNameLengthPtr->signalLength; // content: 324502 maybe pointer?
int signalLengthDebugVar2 = (int) pBuf[30]; // content 2
sig1.setNameLength(signalLengthDebugVar2);
}

最佳答案

当您打印该值时,您只读取 pBuf + 30 处的单个字节:

// takes pBuf[30], converts that byte's value to int, and prints it
printf("Value SignalLength: %d \r\n", pBuf[30]); // 2

稍后,当您转换指针并取消引用它时,您正在访问一个完整的 int,它是 sizeof(int) 字节(可能是 4)。这不仅占用了 pBuf + 30 处的字节,还占用了 pBuf + 31 处的后续字节,等等,直到 sizeof(int)在你的平台上。它还会根据您平台的字节字节序(Intel 的小端字节序,大多数其他平台的大端字节序)解释这些字节。

// the signalLength struct member is an int
int signalLengthDebugVar1 = signalNameLengthPtr->signalLength; // content: 324502 maybe pointer?

另请注意,允许编译器在其 signalLength 字段位置之前或之后添加填充。换句话说,您不能假定 signalLength 将从结构偏移量零开始,除非您使用 extern "C" 或特定于编译器的 #pragma。即便如此,您也无法控制字节序解释,因此如果数据被编码为大端,而您在 x86 等小端机器上,您看到的值将是错误的。

底线是,在 C++ 中,这不是解码二进制数据的安全方法。

关于C++得到指针而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22610371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com