您的程序在编译时确实不会遇到任何问题.它是关于编译的所有有效代码.
但是,它将在运行时遇到未定义的行为,因为a+5它不是有效的地址.
如果你想知道它为什么要编译,你可以编写如下代码:
int func( int * buf, size_t size )
{
for( size_t i = 0; i < size; ++i )
{
*(buf + size) = static_cast<int>(i); // or (int)i in C
}
}
int main()
{
int buf[ 6 ];
func( buf, 6 );
}
Run Code Online (Sandbox Code Playgroud)
在你的代码中a是一个指向内存的指针.a + 5表示从a点开始的地址5"整数" .正如a指向一个整数b,不能保证这样的地址.有趣的是,a+1即使它指向内存中你不应该读取或写入的位置,也可以很好地定义它.但是指针本身有一些保证,即它会大于a并且如果你从它中减去1,你将会回到它a,如果你在它之间做一个ptrdiff,a你将得到1.但这只是"一个特殊属性"过去结束"允许程序员指定内存范围.