Содержание массива C ++ меняется между вызовами функций - PullRequest
1 голос
/ 13 мая 2011

Пример кода:

#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 ]

7 голосов
/ 13 мая 2011

В вашем конструкторе есть две строки:

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

Вы устанавливаете указатель на переменную-член myArr равным адресу локальной переменной temp. Но temp выходит за рамки и уничтожается , как только вы вернетесь из конструктора.

После этого myArr относится к хранилищу, которое больше не выделяется и имеет неопределенное поведение.

2 голосов
/ 13 мая 2011

Потому что это не массив:

   unsigned int* myArr; //The array

... это указатель.Указатель и массив совершенно разные вещи.В некоторых случаях массивы могут быть разложены на указатели, но они по-прежнему не одно и то же.

Это массив:

      unsigned int temp[4];

... и он падает со стекав конце функции.

Когда вы делаете это:

myArr = temp;

... вы не копируете содержимое массива, вы просто копируете адресПервый элемент массива.Когда функция, в которой выделено temp, завершается, сам массив падает со стека, и myArr становится диким указателем, указывающим на неинициализированную память.

0 голосов
/ 13 мая 2011
unsigned int temp[4];
for (unsigned int i=0;i<4;i++) {
    temp[i] = 0;
}
myArr = temp; // OOPS!

Вы инициализировали myArr значением, которое было в стеке. Когда конструктор завершил выполнение, компилятор C ++ смог снова использовать это пространство, и он это сделал.

...