示例代码:
#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++编译器可以自由地重用该空间,并且确实如此。