Значения массива C ++ по умолчанию в разных местах памяти - PullRequest
2 голосов
/ 27 сентября 2019

Это не дублирует вышеуказанный вопрос, поскольку statics различия не рассматриваются и ответы содержат ошибки.

Это базовый вопрос об организации памяти в процессе, а более конкретно:значения массива по умолчанию.

В приведенном ниже коде:
arr1 размещается статически в блоке памяти рядом с машинными инструкциями и в какой-то момент инициализируется по умолчанию как 0
arr2.стек при создании функционального фрейма никогда не инициализируется по умолчанию
arr3 совпадает с arr1 [?]
arr4 совпадает с arr2 [?]
arr5... теперь мой главный вопрос, помимо двух вышеупомянутых, состоит в том, как переменная static внутри класса отличается от переменной static внутри функции?Я не могу получить доступ к неинициализированному элементу arr5.В каких случаях я могу?

int arr1[5];    

void func() {   
    int arr2[5];        printf("%d\n", arr2[0]);          // [2]
    static int arr3[5]; printf("%d\n", arr3[0]);          // [3]
}

class MyClass {
public:
    int arr4[5];
    static int arr5[5];
};

int main() 
{   
    printf("%d\n", arr1[0]);                // [1]

    func();

    MyClass obj;
    printf("%d\n", obj.arr4[0]);            // [4]
    //printf("%d\n", obj.arr5[0]);          // [5]


    std::cin.get();
}

Выход:

0
-858993460
0
-858993460

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Согласно эта статья arr5 объявлена, но не определена.

Добавить

int MyClass::arr5[5];

после объявления class MyClass.Чем вы можете получить obj.arr5[0]

class MyClass {
public:
    int arr4[5];
    static int arr5[5];
};

int MyClass::arr5[5];
0 голосов
/ 27 сентября 2019

Область видимости arr1 является глобальной и существует до конца программы.Область видимости arr2 является локальной, и она будет создаваться и уничтожаться при каждом вызове функции.

Область видимости arr3 является локальной.Локальные статические переменные создаются и инициализируются при первом использовании, а не при запуске программы, и будут уничтожены, когда программа существует.arr1 и arr2 не совпадают с точки зрения объема и времени инициализации.Область видимости arr1 является глобальной локальной областью arr3 (область видимости функции).arr1 будет инициализирован, когда программа запустит arr3, когда будет вызвана функция.

arr4 является членом MyClass, он будет создаваться / уничтожаться каждый раз, когда вы создаете / уничтожаете объект MyClass.Доступ к нему можно получить только через объект MyClass.Таким образом, arr4 и arr2 не совпадают.arr5 является статическим членом класса.Он не связан с объектом MyClass.Вы можете использовать его без создания объекта MyClass.Вы можете получить к нему прямой доступ следующим образом MyClass :: arr5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...