Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未指定的指针转换在C++;14?_C++_Pointers_Language Lawyer_C++14_Reinterpret Cast - Fatal编程技术网

C++ 未指定的指针转换在C++;14?

C++ 未指定的指针转换在C++;14?,c++,pointers,language-lawyer,c++14,reinterpret-cast,C++,Pointers,Language Lawyer,C++14,Reinterpret Cast,某些指针强制转换的结果被描述为未指定。例如,[expr.static.cast]/13: 类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,[…]如果原始指针值表示内存中字节的地址A,并且A满足T的对齐要求,则生成的指针值表示与原始指针值相同的地址,即,A.未指定任何其他此类指针转换的结果 我的问题是:在对齐不满意的情况下,可能的结果是什么 例如,是否允许以下结果 空指针 无效指针值(即不指向大小为T的已分配存储器的指针) 指向内存中

某些指针强制转换的结果被描述为未指定。例如,[expr.static.cast]/13:

类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue,[…]如果原始指针值表示内存中字节的地址A,并且A满足T的对齐要求,则生成的指针值表示与原始指针值相同的地址,即,A.未指定任何其他此类指针转换的结果

我的问题是:在对齐不满意的情况下,可能的结果是什么

例如,是否允许以下结果

  • 空指针
  • 无效指针值(即不指向大小为
    T
    的已分配存储器的指针)
  • 指向内存中完全独立部分中的
    T
    的有效指针

代码示例供参考:

#include <iostream>

int main(int argc, char **argv)
{
    int *b = (int *)"Hello, world";   // (1)

    *b = -1;                           // (2)
    std::cout << argc << '\n';
}
#包括
int main(int argc,字符**argv)
{
int*b=(int*)“你好,世界”//(1)
*b=-1;//(2)
标准::cout
我的问题是:在对齐不满意的情况下,可能的结果是什么

据我所知,这部分回答了这个问题,虽然有些间接。本文提到了您所引用的[expr.static.cast]/13的变化,特别是添加了:

[…]如果原始指针值表示内存中某个字节的地址A,且A满足T的对齐要求,则生成的指针值表示与原始指针值相同的地址,即A。未指定任何其他此类指针转换的结果。[…]

关于这一变化
N4303
说(我的重点):

在采用DR 1412[CWG1412]的分辨率之前,bp的值在初始化时未指定,随后通过新表达式传递给运算符new。所述指针可能为空、对齐不足或使用时存在危险。

因此,未指定的转换可能导致:

  • 空指针

  • 没有完全对齐的指针
  • 使用危险的指针

呃,它是未指定的。”…那么这个程序可以输出
-1
,而不触发未定义的行为”是一种奇怪的说法,我会说是错误的。第(2)行总是导致未定义的行为。“未定义的行为”只是意味着程序的任何行为都符合规范,包括输出-1的行为。“未指定的值”是规范不约束的值(而不是行为),实现不需要记录。@Nemo第2行如何产生UB(如果
b
有值
&argc
)@未指定的EJP:例如,未指定的
int
不能包含
UINT\u MAX
。因此未指定值的可能性总是有限的。使用
int
这一点很清楚。使用指针…不太可能在
行上指定未指定的rhs值(1)
对于lhs,会导致未定义的行为?“使用危险的指针”似乎很脆弱。“无效指针值”肯定是使用危险的指针;还有什么其他可能性?“未充分对齐的指针”-据我所知,除了严格的别名规则外,没有其他文本会阻止使用此类指针。只有我们讨论的这一条款可能会首先阻止创建此类指针。因此,据推测,在强制硬件对齐的机器上,它们不能返回未充分对齐的点呃。@MattMcNabb:仅列举一些其他可能性:一个不与自身进行比较的指针,或者一个指针算术中断的指针(即p+1-1!=p)@msalter只有在
p+1
导致未定义行为时才会发生(这似乎是其中一种情况)@MattMcNabb你的评论很好,我现在没有更多的补充,这就是我所能挖掘到的。