当前位置: 首页 > 知识库问答 >
问题:

有一个std::byte指针作为char*相同的混淆现象?

慕容晔
2023-03-14

C(和C)严格的别名规则包括< code>char*和< code>unsigned char*可以为任何其他指针起别名。

AFAIK对于uint8_t*没有类似的规则。

因此,我的问题是:<code>std::byte</code>指针的别名规则是什么?

C参考目前仅指定:

与字符类型(char、unsigned char、signed char)一样,它可以用于访问由其他对象(对象表示)占用的原始内存,但与这些类型不同,它不是字符类型,也不是算术类型。

共有1个答案

楚羽
2023-03-14

从目前的标准草案([basic.types]/2)中:

对于简单复制类型T的任何对象(基类子对象除外),无论该对象是否持有类型T的有效值,组成该对象的底层字节([intro.memory])都可以复制到char、unsignchar或std:: 字节([cstddef.syn])的数组中。

因此,正如cppreference总结的那样,相同的别名规则适用于这三种类型。

还应该提到([basic.lval]/8.8):

如果程序尝试通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:

    < li >字符、无符号字符或std :: byte类型。
 类似资料:
  • 我不知道为什么下面的代码运行得很好,没有< code>gcc错误(< code >-f strict-aliasing-Wstrict-aliasing = 1 )。 如果我遵循严格的别名规则: n1570,§6.5表达式 对象的存储值只能由具有以下类型之一的左值表达式访问: -与对象的有效类型兼容的类型, — 与对象的有效类型兼容的类型的限定版本, -与对象的有效类型对应的有符号或无符号类型的类

  • 我已经运行这个程序好几次了,每次最后打印的p和g的值都是一样的。我不太确定为什么会这样——malloc不能在理论上选择内存中的任何位置让p和g指向吗?为什么p 8总是等于g?如果能澄清,将不胜感激。 谢谢

  • 问题1。数组名不是指向数组开头的指针吗??如果是这样,那么为什么sizeof运算符在上述代码中计算为两个不同的值。 i、 e为什么产生8,而产生12,即使它们都指向一个字符。 为什么在第二种情况下打印数组的大小? 这个问题看起来像是这个问题的复制品,但它不能回答我的问题。

  • 在下面给出的代码中,我声明了一个指向int的指针,我们都知道memcpy返回一个指向目标字符串的空指针,所以如果ptr是指向int的指针,那么为什么printf(“%s”,ptr);是完全有效的,ptr毕竟不是指向char的指针。

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • 我在学习K K 当一个方法从同步块中执行代码时,代码被称为在同步上下文中执行。当您同步一个方法时,用于调用该方法的对象是必须获取其锁的对象。但是当我们同步代码块时,您必须指定要使用哪个对象的锁作为锁。 在本例中,会在AccountDanger实例或Account对象上获取锁吗?我想应该是这样的。我感觉正确吗?如果它是AccountDanger对象,并且一个线程已获得AccountDanger锁,那