我是一名编程和 C++ 新手。如果能提供一些帮助,我将不胜感激。
下面的程序(c++)在编译和运行时都没有遇到任何问题:
int main()
{
int b = 5;
int*a = &b;
*(a+5) = 6;
return 0;
}
但根据我了解到的一切,它应该不起作用,因为 a 是指向单个变量的指针。我在这里缺少什么?
最佳答案
您的程序在编译时确实应该不会遇到任何问题。这些都是关于编译的有效代码。
但是它会在运行时遇到未定义的行为,因为 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 );
}
在您的代码中,a
是指向内存的指针。 a + 5
表示 a
指向的地址 5 个“整数”。由于 a
指向单个整数 b
,因此无法保证这样的地址。有趣的是,它被很好地定义为引用 a+1
,即使它指向内存中您不应读取或写入的位置。但是指针本身有一些保证,即它会大于 a
并且如果你从中减去 1 你会回到 a
如果你在它之间做一个 ptrdiff和 a
你会得到 1。但这只是“最后一个”的特殊属性,它允许程序员指定内存范围。
关于c++ - 指针行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27939546/