C ++数组内容在函数调用之间变化

时间:2011-05-12 20:52:32

标签: c++ arrays integer overflow

示例代码:

#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("%u\n",arr[i]);
        }
        printf("\n");
    }
};

main() {
    compArray test;
    test.set();
}

输出:

  

打印阵列============
  0
  0
  0
  0

     

打印阵列============
  134513919个
  3221174380个
  0
  0

我确信这很简单,我很遗憾,但为什么会这样呢?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

因为这不是数组:

   unsigned int* myArr; //The array

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

这是数组:

      unsigned int temp[4];

......它在功能结束时从堆栈中掉落。

执行此操作时:

myArr = temp;

...你没有复制数组的内容,你只是复制数组第一个元素的地址。当分配了temp的函数退出时,数组本身就会从堆栈中掉出来,myArr变成一个指向未初始化内存的指针。

答案 2 :(得分:0)

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

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