C/C++

В программе определена переменная double (*a)[20];

В программе определена переменная double (*a)[20]; Сколько байт будет выделено в статической и динамической памяти при создании динамической матрицы на 10 строк и 10 столбцов. Привести расчеты и пояснения.
double (*a)[20] указатель на одномерный массив который приведен к статическому двухмерному с размером столбца 20. Сам по себе он не предоставляет информации, где именно хранится массив, в статической или в динамической памяти.
Пример:
 double d[10][10]; 
double* f = new double[100] {};
auto a = reinterpret_cast(f); //приведение к динамической матрице
auto c = d; //приведение к статической матрице
Если организовывать именно через (*a)[20] матрицу 10*10 - по сути нужна матрица 10*20 в которой половина не будет использоваться.
Для статической матрицы это 200 * 8 = 1600 байт, плюс указатель а на 8 байт = 1608 байт в стеке.
Для динамической матрицы это 8 байт в стеке на указатель и 1600 байт в куче.
ЕП
Евгений Пенкин
51 417
Лучший ответ
Переменная `double (*a)[20]` в вашем коде представляет собой указатель на одномерный массив из 20 элементов типа `double`. Если вы используете эту переменную для создания динамической матрицы размером 10x10, то вам потребуется изменить объявление на `double (*a)[10]`.

В C и C++, размер типа `double` обычно составляет 8 байт (это может варьироваться в зависимости от конкретной системы, но 8 байт является стандартом для многих современных систем).

Таким образом, если вы создаете динамическую матрицу размером 10x10, вы будете использовать `10 * 10 * 8 = 800` байт динамической памяти.

Что касается статической памяти, переменная указателя `a` будет использовать столько байт, сколько обычно использует указатель в вашей системе. Это обычно 4 байта для 32-битных систем и 8 байт для 64-битных систем.

Ниже приведен пример кода, который создает такую матрицу в C:

```c
double (*a)[10] = malloc(10 * sizeof(*a));
```

В этом коде `sizeof(*a)` дает размер одного одномерного массива из 10 элементов `double`, что равно `10 * 8 = 80` байт. Затем мы умножаем это на 10, чтобы получить общий объем памяти, необходимый для 10 таких массивов, т.е. 800 байт.

Память, выделенная через `malloc`, является динамической, и ее нужно освободить после использования с помощью функции `free(a)`, чтобы избежать утечек памяти.
VB
Volkan Bag
14 368
10*10*sizeof(double)
.
sizeof(double) - потому что размер байт в разных системах, компиляторах может быть разным
Ivan Off
Ivan Off
1 597