C++有地址存在吗?

3
假设我在C++中有以下代码:
char buffer[SIZE];
char * ptr = &buffer[SIZE];

指针 ptr 的值从未被解引用。在C++中这样做是否合法?也就是说,使用数组的最后一个元素的下一个位置的内存地址(比如作为特殊值进行比较)。


6
这段代码能编译通过吗?它应该改为 char * ptr = &buffer[SIZE]; 吗? - rwong
2
可能是重复问题:https://dev59.com/RHNA5IYBdhLWcg3wX8rk - cpx
3
当你说 buffer[SIZE] 时,你进行了反引用操作...在正式的语言中它是一个灰色地带,但值得一提的是,我所见过的编译器都不会出现任何意外情况。 - Johannes Schaub - litb
1
@litb:这不是一个灰色地带。标准明确允许获取地址,但对该地址进行解引用明确是未定义的行为。 - John Dibling
1
@John 但是使用[]会对其进行解引用!我想应该真正说的是buffer+SIZE而不是&buffer[SIZE] - user2100815
显示剩余3条评论
2个回答

10

如果你说:

char buffer[SIZE];
char * ptr = & buffer[SIZE];

如果你是在使用迭代器等情况下,那么这种用法是合法的。C++标准明确允许您以这种方式使用数组的末尾位置。

编辑:但请参考litb和Steve Jessop的评论。如果您想完全正确地处理此问题,您可能需要:

char * ptr = buffer + SIZE;

无论如何,超出末尾的地址都是有效的地址 - 也许不太清楚的问题(据我所知)是你是否被允许对其进行解引用。


事实上,许多STL算法的实现都依赖于这个保证。 - John Dibling
@John:哪些STL算法的实现依赖于执行&*(ptr+offset)?它们都不涉及数组和偏移量,而是处理迭代器(因此有时涉及指针)。地址buffer+SIZE肯定没问题,这在指针加法的定义中已经明确处理了。问题在于中间的左值*(buffer+SIZE) - Steve Jessop

6
你的意思是&buffer[SIZE]吗?是的,在C++中是合法的。指针ptr的值是数组buffer的末尾,大多数标准算法可以将其用作buffer的end()迭代器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接