Если я использую malloc и calloc для переменной с плавающей запятой и присваиваю ей значение int, что будет с остальными 2 байтами?

int x=(int)malloc(sizeof(float));

или же

int y=(int)calloc(1,sizeof(double));

Короче говоря, если я попрошу больший блок памяти, используя malloc() или же calloc() но назначьте его переменной памяти меньшего размера, что тогда происходит с дополнительной памятью?

-3

Решение

Прежде всего, 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 из них. В этом нет никаких технических проблем.

3

Другие решения

Ответ на остальные два байта

если у нас есть следующая строка кода

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).

Короче, оставшиеся два байта будут следующим целым числом, и с этим проблем нет.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector