Определить объем памяти для данных:
Решение:
20 * (10 * sizeof(int)+ sizeof(signed char) + 5 * sizeof(float*))
+ sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char)
или подробнее:
20 * (10*sizeof(struct S) + sizeof(char **) + 2*sizeof(char *) + (4 + 1 + 3 + 1)*sizeof(char) =
= 20 * (10 * sizeof(int)+ sizeof(signed char) + 5 * sizeof(float*))
+ sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char)
В дополнение, можно привести и возможный числовой результат, например:
= 20 * (10 * 2 + 1 + 5 * 4) + 2 + 2 * 2 + 9 * 1 = 814 байт = 814 * 8 бит = 6512 бит
Объясните пожалуйста решение. Не понятно, откуда взялось (и почему коэффициенты 2 и 9) sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char) и как влияет на решение и ответ char *s[]= {"КГТУ","КГУ"}. Спасибо.
Решение:
20 * (10 * sizeof(int)+ sizeof(signed char) + 5 * sizeof(float*))
+ sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char)
или подробнее:
20 * (10*sizeof(struct S) + sizeof(char **) + 2*sizeof(char *) + (4 + 1 + 3 + 1)*sizeof(char) =
= 20 * (10 * sizeof(int)+ sizeof(signed char) + 5 * sizeof(float*))
+ sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char)
В дополнение, можно привести и возможный числовой результат, например:
= 20 * (10 * 2 + 1 + 5 * 4) + 2 + 2 * 2 + 9 * 1 = 814 байт = 814 * 8 бит = 6512 бит
Объясните пожалуйста решение. Не понятно, откуда взялось (и почему коэффициенты 2 и 9) sizeof(char **) + 2 * sizeof(char *) + 9 * sizeof(char) и как влияет на решение и ответ char *s[]= {"КГТУ","КГУ"}. Спасибо.
sizeof(char **) - это место для хранения переменной s, которая фактически имеет тип char**.
2 * sizeof(char *) - это место для хранения двух элементов массива s, каждый из которых является указателем на строку.
sizeof(char **) - это место для хранения переменной s, которая фактически имеет тип char**.
А почему она имеет такой тип? И почему там 2 указателя, а не 1? Почему такой тип занимает только 2 бита?
Допустим пример:
Вычислить объем:
float z[10][2][3]; char *x, s[100].
Окончально получиться: 10*2*3*sizeof(float) + sizeof(char **) + sizeof(char) + 100*sizeof(char). Верно?
Потому что когда вы определяете массив через type A[10], то A у вас будет иметь тип type*.
И почему там 2 указателя, а не 1?
Потому что это массив массивов char, а массив хранится в виде указателя на первый элемент массива. Получается указатель на указатель на char.
Почему такой тип занимает только 2 бита?
У вас там как-то странно расставлены размеры. sizeof(float*) получается 4, например, а sizeof(char *) - 2. Обычно размеры всех указателей одинаковы (4 байта в 32-битных ОС и 8 байт в 64-битных). Так что численный ответ не очень правдоподобен. Впрочем, всё зависит от компилятора, размеры всех типов могут быть какими угодно.
Допустим пример:
Для вашего примера:
10*2*3*sizeof(float) - для хранения содержимого массива z
sizeof(float***) - для хранения указателя z
sizeof(char*) - для хранения указателя x
sizeof(char*) - для хранения указателя s (он тоже типа char*)
100*sizeof(char) - для хранения содержимого массива x
sizeof(float***) - для хранения указателя z
Здесь sizeof(float***) имеет 3 указателя потому что это трехмерный массив?
sizeof(char*) - для хранения указателя s (он тоже типа char*)
Для массивов всегда так? То есть при вычислении объема памяти для массивов нужно еще и выделять память для указателя (на первый элемент)?
sizeof(char*) - для хранения указателя x
А здесь выделяется память только для указателя, а для самого элемента не нужно выделять?
да
Для массивов всегда так?
В первом приближении да.
А здесь выделяется память только для указателя, а для самого элемента не нужно выделять?
А там и нет никакого элемента, только указатель. Элементы создаются, если у нас указано число в квадратных скобках: "char x[10]", либо через оператор new: "char* x = new char[10]". А когда мы просто декларируем указатель на char: "char* x", кроме него, ничего не создается. Да и сам указатель будет указывать непонятно на что.