[英]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,这意味着它要求字符数组的内容具有给定的字节顺序。
总的来说,在执行此类操作时,使用诸如int
或char
(可能是signed)之类的签名类型没有任何意义。 特别是, char
类型非常有问题,因为它具有实现定义的签名,应该避免。 请使用unsigned char
或uint8_t
。
稍差的代码看起来像这样:
#include <stdint.h>
uint8_t buffer[4096];
// some code
uint32_t size = *(uint32_t*)buffer;
任何人都可以帮助我理解以下陈述的作用吗?
第一个声明:
char buffer[4096];
声明一个大小为4096
的chars
数组。
第二个声明:
int size = *(int*)(buffer);
1.首先将衰减的字符指针带到数组buffer
(也称为buffer
),这是一个指向其第一个元素的指针,在其声明时设置
2.然后将其转换为指向int
或int*
指针
3.最后,将此指针的内容(将为int
类型)分配给可变size
。
它接受buffer[0]
的地址,将其转换为int*
,取消引用,并使用解除引用的值初始化size
。 换句话说,它占用buffer
的第一个sizeof(int)
字节,假装这些字节是int
,并将int的值存储在size
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.