У меня есть несколько простых вопросов:
Правильно ли следующее в соответствии с обычным компилятором 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);
}
Если границы массива строго должны быть константным выражением, почему следующее не генерирует ошибки компилятора?
int func(int m, int n)
{
int arr[m][n]; //m and n are not known until run time
}
Правильно ли следующее в соответствии с обычным компилятором c ++?
Да, потому что Стандарт определяет, что даже массивы с более чем 1-мя измерениями являются постоянными в памяти. НО! Вы неправильно понимаете индексирование и длину массива — я и j должны быть строго меньше чем 3 и 4 соответственно. 3 и 4 — размеры массива в двух измерениях, и не максимально возможные подписки.
Если границы массива строго должны быть константным выражением, почему следующее не генерирует ошибки компилятора?
Может быть, вы используете компилятор, который поддерживает это как расширение (подумайте о GCC, Clang и т. Д.)
Это на самом деле неопределенное поведение при доступе к массиву a
используя неинициализированные значения i и j. В противном случае, если вы используете правильное вычисление индекса массива (в пределах границ), то это допустимо.
Вы можете использовать расширение GCC для массив переменной длины в твоем случае.