декларация и адресация массивов

У меня есть несколько простых вопросов:

  1. Правильно ли следующее в соответствии с обычным компилятором c ++?

    int arr[3][4];
    void func(int *a, int m, int n)
    {
    int i,j;
    cin>>i>>j;
    cout<< a[i*n + j]; //is this way of addressing correct provided 0<=i<m and 0<=j<n
    }
    
    int main()
    {
    func((int*)arr, 3,4);
    }
    
  2. Если границы массива строго должны быть константным выражением, почему следующее не генерирует ошибки компилятора?

    int func(int m, int n)
    {
    int arr[m][n]; //m and n are not known until run time
    }
    

-1

Решение

Правильно ли следующее в соответствии с обычным компилятором c ++?

Да, потому что Стандарт определяет, что даже массивы с более чем 1-мя измерениями являются постоянными в памяти. НО! Вы неправильно понимаете индексирование и длину массива — я и j должны быть строго меньше чем 3 и 4 соответственно. 3 и 4 — размеры массива в двух измерениях, и не максимально возможные подписки.

Если границы массива строго должны быть константным выражением, почему следующее не генерирует ошибки компилятора?

Может быть, вы используете компилятор, который поддерживает это как расширение (подумайте о GCC, Clang и т. Д.)

2

Другие решения

Это на самом деле неопределенное поведение при доступе к массиву a используя неинициализированные значения i и j. В противном случае, если вы используете правильное вычисление индекса массива (в пределах границ), то это допустимо.

Вы можете использовать расширение GCC для массив переменной длины в твоем случае.

1

По вопросам рекламы [email protected]