示例代码:
#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
我确信这很简单,我很遗憾,但为什么会这样呢?
答案 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 ++编译器可以自由地重用该空间,而且确实如此。