Глобальный статический массив в C ++

0

У меня есть что-то вроде этого:

static int n = 0; // global static int
int *arr = new int[n]; // global int*

int randToArray(int arr[], int min, int max) {
    srand(time(NULL));
    for(int i = 0; i <= n; i++) {
        arr[i] = (rand() % max + min);  
    }           
}

void printArray() {
    if(n) {
        for(int i = 0; i < n; i++)
        cout << arr[i] << endl; 
    } else
        cout << "The array hasn't been drawed yet.";        
}

А затем в основной функции у меня есть меню с переключателем и опции для получения случайных чисел и печати массива:

switch(option) {
case 1:
    cout << "Set the size of the array: ";
    cin >> n;
    randToArray(arr, 1, 99);
    break;
case 2:
    printArray();
    wait();
    break;
}

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

Все работает, кроме одного: когда я хочу напечатать массив, я получаю работоспособность только 8 первых элементов. Затем терминал показывает некоторые очень большие числа.

  • 0
    н равен нулю? Это не будет работать правильно. Кроме того, независимо от размера n, вы хотите, чтобы ваш цикл заканчивался на i < n поскольку ваш массив имеет индекс от 0 до n-1.
  • 0
    Где ... вы видите глобальный статический массив?
Теги:
arrays
global-variables

2 ответа

4
Лучший ответ

Это потому, что вы используете

static int n = 0;

затем выделите память для нулевых элементов.

Измените строку static int n = 256; например, выделить память на 256 элементов.

Или, если вы читаете n после, выделите память ПОСЛЕ того, как вы прочитали n. То есть объявить массив глобально сначала (технически указателем), как int *arr; , тогда

arr = new int[n];

после cin >> n;

  • 0
    отсутствует if (arr) delete [] arr; до нового размещения.
  • 0
    @SHR, да, ОП должен это проверить :)
0

static - это перегруженное ключевое слово.
То, как вы его используете, означает перевод-unit-local.

Кроме того, у вас нет глобального массива в вашем коде, только указатель инициализирован, чтобы указывать на начало выделения 0 int s.
Это распределение не будет изменено, если вы позже измените n.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню