int x=(int)malloc(sizeof(float));
или же
int y=(int)calloc(1,sizeof(double));
Короче говоря, если я попрошу больший блок памяти, используя malloc()
или же calloc()
но назначьте его переменной памяти меньшего размера, что тогда происходит с дополнительной памятью?
Прежде всего, malloc()
и семья возвращает указатель на void
(void *
), который мы храним в «Указатель на тип» а затем использовать этот указатель для хранения значений «тип» в место памяти.
Что касается звонка malloc()
и семейство, мы передаем требуемый размер в байтах, и они возвращают указатель на запрошенную область памяти (в байтах), в случае успеха. Итак, пока x
, y
а также z
оценивает то же самое,
int * p = malloc(x);
или же,
int * p = malloc(y);
или же
int * p = malloc(z);
вернет то же количество памяти.
Теперь, если это произойдет, на вашей платформе, sizeof(int) == sizeof(float) == 4
тогда мы можем написать
int * p = malloc(sizeof(int));
или же,
int * q = malloc(sizeof(float));
или же
int * r = malloc(4);
и они все вернут одинаковое количество памяти.
Примечание. Вышеприведенные утверждения приведены только для иллюстрации. Это лучший способ использования
malloc()
это использовать форму<someType> * var = malloc(sizeof(*var));
FWIW, (как вы сделали в своем коде) назначение указателя на целочисленный тип — это поведение, определяемое реализацией. В общем, не делай этого.
Тем не менее, вы всегда можете выделить больше памяти, чем нужно, с точки зрения C проблем нет, если вы free()
тот. Например, вы можете выделить место для 10 целых чисел, в то время как вы используете только 5 из них. В этом нет никаких технических проблем.
если у нас есть следующая строка кода
int *x=(int*)malloc(sizeof(float));
Здесь malloc возвращает указатель, который затем типизируется до целочисленного типа указателя.
Предполагая, что float имеет размер 4 байта и int 2 байта. Теперь аргумент, который передается malloc
это только количество байтов, которые вы хотите выделить. Вот sizeof(float)
возвращает 4 и 4 байта выделены, а malloc возвращает указатель на первые байты, которые выделены. Так что в этом случае есть выделено два целых пространства а это непрерывное распределение. Таким образом, первые два байта для первых int и следующих 2 байтов являются следующим целым числом и становятся массивом.
Мы можем получить к ним доступ как
x [0], который совпадает с * (x + 0), и x [1], который совпадает с * (x + 1).
Короче, оставшиеся два байта будут следующим целым числом, и с этим проблем нет.