为什么不同的指针会表现得好像它们共享相同的值
Why Would Different Pointers Act As If They Shared The Same Values?
下面我使用了两个不同的函数来初始化一个2D数组。每个返回一个数组,该数组存储在适当的指针中。没有全局变量。当一个人被赋予一个值时,他们都表现得好像他们已经收到了它。代码和日志说明。
尽我所能尝试,我不明白为什么这有意义。起初,这两个未初始化的值都是有意义的。但是在那之后,为什么设置 A 也设置 B 相同?那么为什么设置 B 会覆盖 A?
法典:
#include <iostream>
int **MakePtrArrayA( int Size ){
int ** myArr = new int*[ Size ];
for( int x=0; x<Size; x++ ){
myArr[x] = new int;
}
return myArr;
}
int **MakePtrArrayB( int Size){
int ** myArr;
for( int x=0; x<Size; x++ ){
myArr[x] = new int[ Size ];
}
return myArr;
}
int main(){
int ** arrA = MakePtrArrayA( 5 );
int ** arrB = MakePtrArrayB( 5 );
std::cout << "A:" << arrA[4][4] << std::endl << "B:" << arrB[4][4] << std::endl;
arrA[4][4] = 16;
std::cout << "A:" << arrA[4][4] << std::endl << "B:" << arrB[4][4] << std::endl;
arrB[4][4] = 15;
std::cout << "A:" << arrA[4][4] << std::endl << "B:" << arrB[4][4] << std::endl;
return 0;
}
日志:
A:0
B:0
A:16
B:16
A:15
B:15
MakePtrArrayB
通过使用未初始化的指针调用未定义的行为。
未定义的行为可以是任何东西,但在您的情况下,MakePtrArrayB
中的myArr
指针可能占用与MakePtrArrayA
中的指针相同的内存,因此循环访问原始数组(将其设置为新分配的行缓冲区,这些缓冲区足够大以进行后续访问)。
但是您不能依赖这种行为。 修复错误。
您没有初始化 MakePtrArrayB
中 myArr
的值。因此,取消引用该指针的结果是未定义的 - 任何事情都可能发生。
在这种情况下,发生的情况是 myArr
的值重用在上一次调用 MakePtrArrayA
期间设置的相同值。(这很可能是因为这两个函数具有相同的堆栈布局,并且堆栈位置未被其他任何内容覆盖。显然,您不应该依赖这种行为!它不会可靠地工作。
前面的答案中没有提到的另一个问题是您在arrA
上越界访问:
int **MakePtrArrayA( int Size ){
int ** myArr = new int*[ Size ];
for( int x=0; x<Size; x++ ){
myArr[x] = new int; // <--- row length 1
主要:
std::cout << "A:" << arrA[4][4] // <--- access 5th element
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针