28得票3回答
将T*与char*进行别名定义是允许的。反过来也允许吗?

注意:这个问题已经被重命名和简化,以使其更加聚焦和易读。 大多数评论都是针对旧文本的。 根据标准,不同类型的对象可能不能共享同一内存位置。因此,以下情况将是不合法的:std::array<short, 4> shorts; int* i = reinterpret_cast&...

327得票16回答
C和C++中联合体的目的

我以前使用联合体感到很自在;今天当我读到这篇文章后,我感到很震惊,因为我发现这段代码存在风险。union ARGB { uint32_t colour; struct componentsTag { uint8_t b; uint8_t...

23得票4回答
浮点数位和严格别名

我试图从浮点数中提取位,而不会引发未定义的行为。这是我的第一次尝试: unsigned foo(float x) { unsigned* u = (unsigned*)&x; return *u; } 据我理解,由于严格的别名规则,这并不保证能够正常工作,对吗?如...

53得票9回答
解决解引用类型转换指针会破坏严格别名规则的问题

我正在尝试使用GCC编译一个特定程序时,修复两个警告。这两个警告是: 警告:解引用类型转换指针将破坏严格别名规则[-Wstrict-aliasing]。 这两个问题的罪魁祸首是:unsigned int received_size = ntohl (*((unsigned int*)dcc...

19得票3回答
你可以使用std::bit_cast将一个std::array转换为一个对象的字节吗?

在他最近的演讲中,Timur Doumler提到,std::bit_cast不能用于将float位转换为unsigned char[4],因为C风格数组不能从函数返回。我们应该使用std::memcpy或者等到C++23(或更晚)时,类似reinterpret_cast(&f)[i]的语法将变...

11得票5回答
在C语言中安全地将char*转换为double

在我编写的一个开源项目中pgdbf中,我正在从文件中读取二进制数据(由其他程序编写),并输出整数(ints)、双精度浮点数(doubles)和其他各种数据类型。其中一个挑战是它需要在32位和64位机器上运行,并且支持大端和小端存储方式,这意味着我不得不进行相当多的底层位操作(bit-twidd...

8得票1回答
严格别名规则和std :: array与C风格数组的比较

当使用gcc 4.7(在OS X上使用MacPorts构建的g ++ -mp-4.7(GCC)4.7.0)编译以下代码时,我得到了看似矛盾的结果。 当我尝试将std :: array的一部分重新解释和解引用为uint32_t时,编译器不会发出警告,但是使用C样式数组时会发出警告。 示例代码: ...

985得票11回答
严格别名规则是什么?

当谈到C语言中的常见未定义行为时,人们有时会提到严格别名规则。 他们在说什么?

115得票5回答
可以使用联合体进行类型转换吗?如果不行的话,为什么?

我已经搜索了一段时间,但找不到明确的答案。 很多人说使用联合类型转换是未定义的和不良的做法。为什么会这样呢?我看不出任何原因会导致未定义的行为,因为你写入原始信息的内存不会自己改变(除非它在堆栈上超出作用域,但这不是联合的问题,那将是糟糕的设计)。 人们引用了严格别名规则,但在我看来,这就...

9得票3回答
C++中的严格别名规则和类型别名

我正在尝试理解违反严格别名规则时的未定义行为。我已经阅读了许多关于此问题的文章,但仍有一个问题:我不太明白两种类型何时非法别名。cpp-reference指出: 类型别名 每当试图通过类型为AliasedType的glvalue读取或修改DynamicType类型对象的存储值时,除非以下情...