C++函数调用之间更改数组内容



示例代码:

#include <stdio.h>
class compArray {
public:
    unsigned int* myArr; //The array
    compArray() {
        unsigned int temp[4];
        for (unsigned int i=0;i<4;i++) {
            temp[i] = 0;
        }
        myArr = temp;
        print_arr(myArr);
    }
    void set() {
        print_arr(myArr);
    }
    static void print_arr(unsigned int* arr) {
        printf("Printing the array============n");
        for (unsigned int i=0;i<4;i++) {
            printf("%un",arr[i]);
        }
        printf("n");
    }
};
main() {
    compArray test;
    test.set();
}

输出:

打印数组====
========
0
0
0 0

打印数组====
========
134513919
3221174380
0 0

确定我错过了一些简单的东西,但为什么会这样?

在构造函数中,有以下两行:

unsigned int temp[4];
...
myArr = temp;

将成员变量指针设置为等于局部变量myArr temp 的地址。但是,temp超出了范围,一旦您从构造函数返回,就会被销毁

之后,myArr 是指不再分配的存储,并表现出未定义的行为。

因为这不是一个数组:

   unsigned int* myArr; //The array

。这是一个指针。 指针和数组是完全不同的东西。 在某些情况下,数组可以分解为指针,但它们仍然不是一回事。

这是数组:

      unsigned int temp[4];

。它在函数结束时从堆栈中掉下来。

执行此操作时:

myArr = temp;

。您不是在复制数组的内容,而只是在复制数组中第一个元素的地址。 当分配temp的函数退出时,数组本身会从堆栈中掉下来,myArr变成一个野生指针,指向未初始化的内存。

unsigned int temp[4];
for (unsigned int i=0;i<4;i++) {
    temp[i] = 0;
}
myArr = temp; // OOPS!

您已将 myArr 初始化为堆栈上的值。 当构造函数完成执行时,C++编译器可以自由地重用该空间,并且确实如此。

相关内容

  • 没有找到相关文章

最新更新