Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针在声明时精确指向哪里?_C++_Pointers - Fatal编程技术网

C++ 指针在声明时精确指向哪里?

C++ 指针在声明时精确指向哪里?,c++,pointers,C++,Pointers,如果我声明一个指针用作“动态数组”,如下所示: int *arr; 无需使用new关键字或指定任何大小 这是坏代码吗?这个指针到底指向哪里 在这种情况下,假设我初始化数组,如下所示: arr = new int[5]; 然后打这个电话(对我有用): 我可以用这种方式意外地覆盖一些其他数据吗?(到目前为止,这种情况从未发生在我身上)。在这个指针声明之后,有多少连续的块是空闲的,是否有一个“安全阈值” 指针变量只是另一种变量。它的值取决于它的存储持续时间(您的问题中没有显示) 静态或线程存储持

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

int *arr;
无需使用
new
关键字或指定任何大小

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

在这种情况下,假设我初始化数组,如下所示:

arr = new int[5];
然后打这个电话(对我有用):


我可以用这种方式意外地覆盖一些其他数据吗?(到目前为止,这种情况从未发生在我身上)。在这个指针声明之后,有多少连续的块是空闲的,是否有一个“安全阈值”

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

  • 静态或线程存储持续时间对象初始化为零
  • 自动存储持续时间对象具有不确定的值。(这些是我们在函数中声明的常规“局部变量”。)
读取不确定的值会调用未定义的行为。这样做的程序写得不正确,即使它们有时看起来可以工作。未定义的行为明确地对实现没有任何要求,包括在开始覆盖相邻数据之前不需要安全阈值

但上面只涉及调用未定义行为的“动态”后果(这是大多数人倾向于关注的)。未定义的行为可能会产生更奇怪的“静态”后果


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

是的,由另一个程序操纵程序的可变数据执行时间的风险很高。动态+无大小声明不是好的做法。在运行时占用内存,因此在该时间分配地址。如果您在可用的地址内存中定义了特定位置(空)然后程序将运行,特定内存不会移动,直到程序终止。如果特定位置被占用,则程序将不会执行。

感谢您的精彩解释。但我问题的第二部分(可能有点不相关):如果我声明这样的指针:int*p=new int[5];p[100]=10;这里发生了什么?最初保留了多少内存?我是在这里覆盖其他数据,还是在我进行此类调用时有重新分配?@Ahmedelayamani该声明中保留的内存至少足以容纳5
int
s。保留的任何额外内存(用于记账或对齐)用户代码通常无法访问。索引数组超出其有效边界(无论是读还是写)不会触发重新分配。它只是再次落入UB区域。(覆盖其他数据是可能的情况之一。)@Ahmedelayamani:你应该更喜欢智能指针和容器。除此之外,如果不使用指针,你还会如何使用它们呢?如果你确定你会正确使用它们,在我看来,C风格数组没有什么问题。然而,从C++11开始,有一个
std::array
与C风格数组类似nd提供可选的边界检查(除其他外),还有
std::vector
和其他功能,如您所知。
arr[100] = 10;