指针指向何处何时被指定?

Ahm*_*ani 3 c++ pointers

如果我声明一个指针用作"动态数组",如下所示:

int *arr;
Run Code Online (Sandbox Code Playgroud)

不使用new关键字或指定任何大小.

这是坏代码吗?这个指针到底指向哪里?

在这种情况下,让我说我初始化数组如下:

arr = new int[5];
Run Code Online (Sandbox Code Playgroud)

然后拨打这个电话(对我有用):

arr[100] = 10;
Run Code Online (Sandbox Code Playgroud)

我可以通过这种方式意外覆盖其他一些数据吗?(到目前为止,这从未发生在我身上).关于在此指针声明后剩余多少个连续块,是否存在"安全阈值"?

The*_*kis 7

指针变量只是另一种变量.其值取决于其存储持续时间(未在您的问题中显示).

  • 静态或线程存储持续时间对象是零初始化的.
  • 自动存储持续时间对象具有不确定的值.(这些是我们在函数内部声明的常规"局部变量".)

读取不确定的值会调用未定义的行为.执行此操作的程序编写错误 - 即使它们有时似乎有效.未定义的行为明确地对实现没有要求,包括在开始覆盖相邻数据之前不需要安全阈值.

但上面只涉及调用未定义行为的"动态"后果(这是大多数人倾向于关注的).未定义的行为甚至可能产生陌生的"静态"后果.

可以提前推断出调用未定义行为的代码(无论是针对所有情况还是针对代码中某些表达式的某些值)都允许编译器采取不那么明显的决策,包括删除函数调用甚至整个分支.代码,即使在与您无关的函数中(例如修改错误函数的调用者).Raymond Chen在一篇非常翔实的博客文章中对此进行扩展(我经常将人们引用,因为它非常详细地突出了UB的"静态"后果).