int* a = new int[5] - 1;
Run Code Online (Sandbox Code Playgroud)
这一行本身根据C++标准调用未定义的行为,因为a是一个无效的指针而不是一个接一个的结尾.同时,这是制作基于1的数组(第一个元素是[1])的零开销方式,我需要用于我的项目.
我想知道这是否是我需要避免的,或者如果C++标准只是保守地支持一些奇怪的架构,我的代码永远都不会运行.所以问题是,这将是一个什么样的架构问题?这些广泛存在吗?
编辑:要查看上面的行确实调用了未定义的行为,请查看此问题.
编辑:Dennis Zickefoose指出,当调用未定义的行为时,允许编译器执行任何操作,因此编译器和CPU都必须提供超出C++标准的保证,以便像这样的代码工作.我正在将问题扩展到现代C++编译器是否存在这个问题.
一些C或C++程序员惊讶地发现即使存储无效指针也是未定义的行为.但是,对于堆或堆栈数组,可以存储一个超过数组末尾的地址,这允许您存储"结束"位置以便在循环中使用.
但是从单个堆栈变量形成指针范围是未定义的行为,如:
char c = 'X';
char* begin = &c;
char* end = begin + 1;
for (; begin != end; ++begin) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
虽然上面的例子很没用,但是如果某个函数需要一个指针范围,那么这可能很有用,而且你有一个只有一个值来传递它的情况.
这是未定义的行为吗?