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

时间:2016-02-07 14:49:49

标签: c++ pointers

如果我声明一个指针用作"动态数组"像这样:

int *arr;

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

这是不好的代码吗?这个指针到底指向哪里?

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

arr = new int[5];

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

arr[100] = 10;

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

2 个答案:

答案 0 :(得分:7)

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

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

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

但上述内容仅涉及调用未定义行为的“动态”后果(这是大多数人倾向于关注的)。未定义的行为甚至可能产生陌生的“静态”后果。

可以提前推断出调用未定义行为的代码(无论是针对所有情况还是针对代码中某些表达式的某些值)都允许编译器做出不太明显的决定,包括删除函数调用甚至整个代码分支,甚至在与您无关的函数中(例如修改错误函数的调用者)。 Raymond Chen在a very informative blog post中对此进行了扩展(我经常提到人们,因为它非常详细地突出了UB的“静态”后果)。

答案 1 :(得分:-2)

是,操纵高风险由另一个程序执行程序的可变数据执行时间。动态+没有尺寸声明不是好习惯。在运行时占用的内存因此地址被分配了那个时间。如果您在可用的地址存储器(空)中定义了特定位置,则程序将运行,并且在程序终止之前特定存储器不会移动。如果比程序占用的特定位置不会执行。