为什么不同的指针会表现得好像它们共享相同的值

Why Would Different Pointers Act As If They Shared The Same Values?

本文关键字:共享 指针 为什么不      更新时间:2023-10-16

下面我使用了两个不同的函数来初始化一个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中的指针相同的内存,因此循环访问原始数组(将其设置为新分配的行缓冲区,这些缓冲区足够大以进行后续访问)。

但是您不能依赖这种行为。 修复错误。

您没有初始化 MakePtrArrayBmyArr 的值。因此,取消引用该指针的结果是未定义的 - 任何事情都可能发生。

在这种情况下,发生的情况是 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