У меня есть ситуация, когда я хочу, чтобы моя программа считывала некоторые числа, которые будут определять размер двумерного массива (используется в качестве матрицы). Первоначально я утверждал, что единственный способ сделать это - использовать вызов malloc
для помещения массива в кучу, что-то вроде этого:
matrixElement* matrix = malloc(sizeof(matrixElement) * numRows * numCols);
где numCols и numRows - целые числа, которые были прочитаны ранее, а matrixElement - некоторый произвольный тип. Я рассуждал так, что просто написал:
matrixElement matrix[numRows][numCols];
не будет работать, так как компилятор не сможет узнать, сколько стекового пространства выделить для вызова функции. Оказывается, я был не прав, так как следующий код компилируется и запускается:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int x, y;
scanf("%d", &x);
scanf("%d", &y);
double arr[x][y];
printf("Made an array of size %d by %d, total memory %fKb\n",
sizeof(arr) / sizeof(arr[0]),
sizeof(arr[0]) / sizeof(arr[0][0]),
(float) sizeof(arr) / 1024.0f);
return 0;
}
С достаточно большими числами, введенными для x и y, это в конечном итоге приведет к ошибке, но я был очень удивлен, увидев, что я могу создать массив 1000x1000 с этим кодом.
Может кто-нибудь объяснить, что здесь происходит?
Компилятор просто выделяет кучу места для массива, даже если он не знает, сколько будет использовано?
Указано ли это поведение в ANSI C или это просто то, что делает gcc самостоятельно?