在C++中是否很好地定义了取消引用指向数组类型的一个结束指针?
请考虑以下代码:
#include <cassert>
#include <iterator>
int main()
{
// An array of ints
int my_array[] = { 1, 2, 3 };
// Pointer to the array
using array_ptr_t = int(*)[3];
array_ptr_t my_array_ptr = &my_array;
// Pointer one-past-the-end of the array
array_ptr_t my_past_end = my_array_ptr + 1;
// Is this valid?
auto is_this_valid = *my_past_end;
// Seems to yield one-past-the-end of my_array
assert(is_this_valid == std::end(my_array));
}
通常的看法是,取消引用一个经过一个结束的指针是一种未定义的行为。但是,这对于指向数组类型的指针是否成立呢?
编辑:这个问题不是通过下标获取一个数组元素的地址的重复:根据C++标准是否合法?我在问问题中解释的规则是否也适用于指向数组类型的指针。
编辑2:删除auto
以明确表示my_array_ptr
不是int*
。
这里是CWG232。这个问题看起来主要是关于取消引用空指针的问题,但从根本上讲,它是关于取消引用不指向对象的东西的意思。关于这个案例没有明确的语言规则。
其中一个例子是:
类似地,只要不使用值,就应该允许取消引用指向数组末尾的指针:
char a[10];
char *b = &a[10]; // equivalent to "char *b = &*(a+10);"
这与OP(上述表达式的A[10]
部分)基本相同,只是使用char
而不是数组类型。
通常的看法是,取消引用一个经过一个结束的指针是一种未定义的行为。但是,这对于指向数组类型的指针是否成立呢?
基于是哪种指针的规则没有区别。my_past_end
是一个pass-the-end指针,因此UB是否取消引用它并不取决于它指向一个数组,而不是任何其他类型。
Go语言程序中对指针获取反射对象时,可以通过 reflect.Elem() 方法获取这个指针指向的元素类型。这个获取过程被称为取元素,等效于对指针类型变量做了一个 操作,代码如下: 代码输出如下: name: '' kind: 'ptr' element name: 'cat', element kind: 'struct' 代码说明如下: 第 15 行,创建了cat结构体的实例,ins 是一个
结果是地址而不是数组。怎么解释?
这是用C++语言编写的代码。 为什么在第一个cout语句中,程序尝试打印直到它找到一个空字符,而在第二个语句中,它只打印一个字符?
本文向大家介绍C语言取消引用指针,包括了C语言取消引用指针的使用技巧和注意事项,需要的朋友参考一下 示例 要取消引用a_pointer并更改a的值,我们使用以下操作 可以使用以下打印语句对此进行验证。 但是,将一个NULL指针取消引用或其他无效指针将是错误的。这个 通常是未定义的行为。p1可能不会被取消引用,因为它指向的地址0xbad可能不是有效地址。谁知道那里有什么?它可能是操作系统内存,或另一
嗨我有以下方法: 不得不提的是,startDate和endDate是长变量。我尝试在if条件中添加null检查,也尝试使用longValue()方法,但没有结果。你知道我怎样才能解决这个问题吗?可能是fndBugs端的bug?
问题内容: 我是GoLang的新手,来自Delphi C ++世界-诚然对这种语言感到非常兴奋,我认为它将成为“下一件大事”。 我正在尝试了解Go解析器和编译器如何处理指针和引用-似乎找不到任何放置一些明确规则的地方。 例如,在下面的代码示例中,返回类型和局部变量是指针类型,并且在其声明中需要使用指针符号,但是在使用时不必取消引用它们:。但是在同一代码中,输入参数被声明为指针,并且必须被取消引用才