繁体   English   中英

*(int *)(缓冲区)是什么意思?

[英]What does *(int*)(buffer) mean?

在我正在阅读的c ++代码中,发现了以下内容。 任何人都可以帮助我理解以下陈述的作用吗?

char buffer[4096];
// some code
int size = *(int*)(buffer);
char buffer[4096];//this is an array of 4096 characters
// some code

int size = *(int*)(buffer);

将(衰减的)字符指针( buffer )转换为整数指针。 然后它取消引用它以获得整数值 从中获得的整数值将由buffer数组的前4个字符值组成,假设int的大小在您的机器中是4个字节,或者通常由sizeof(int)字符组成。

换句话说, buffer数组的第一个sizeof(int)字符的内存表示将被视为表示单个整数值,因为现在它由整数指针指向,并且将存储在size取消引用该整数指针时的整数变量。

话虽如此,正如评论部分反复说明的那样,这段代码是不安全的。 有一点我想到的是,有些CPU有严格的对齐要求(参见这个答案 ),在这种情况下,不能保证buffer数组的第一个元素的地址符合整数的对齐要求,从而导致这些CPU中的未定义操作。

请参阅@Lundin答案,了解更多原因,为什么此代码不安全,可能无法提供您正在寻找的结果。

TL; DR:这段代码很糟糕,忘了它并继续前进。


(buffer)这个括号表示程序员对自己的编程能力不安全。

由于buffer是一个字符数组,因此使用标识符buffer为您提供指向第一个元素的指针: char指针。

(int*)这是一个转换,将char指针转换为int指针。

*获取该整数指针的内容,结果存储在整数size

请注意,此代码完全不安全。 许多指针转换会调用定义不明确的行为。 可能存在对齐问题。 可能存在指针别名问题(Google“严格别名规则”)。 此特定代码也依赖于endianess,这意味着它要求字符数组的内容具有给定的字节顺序。

总的来说,在执行此类操作时,使用诸如intchar (可能是signed)之类的签名类型没有任何意义。 特别是, char类型非常有问题,因为它具有实现定义的签名,应该避免。 请使用unsigned charuint8_t

稍差的代码看起来像这样:

#include <stdint.h>

uint8_t buffer[4096];
// some code
uint32_t size = *(uint32_t*)buffer;

任何人都可以帮助我理解以下陈述的作用吗?

第一个声明:

char buffer[4096];

声明一个大小为4096chars数组。

第二个声明:

int size = *(int*)(buffer);

1.首先将衰减的字符指针带到数组buffer (也称为buffer ),这是一个指向其第一个元素的指针,在其声明时设置

2.然后将其转换为指向intint*指针

3.最后,将此指针的内容(将为int类型)分配给可变size

它接受buffer[0]的地址,将其转换为int* ,取消引用,并使用解除引用的值初始化size 换句话说,它占用buffer的第一个sizeof(int)字节,假装这些字节是int ,并将int的值存储在size

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM