Всегда ли calloc () двойного поля имеет значение 0.0? - PullRequest
0 голосов
/ 14 декабря 2018
  • Значение calloc() двойного поля всегда оценивается как 0.0?

Более того :

  • Имеет calloc() поля float всегда равны 0.0f?
  • Значение calloc() поля int или unsigned int всегда оценивается как 0?

То есть , будет assert()ниже всегда удастся на всех платформах?

double* d = calloc(1, sizeof(double));
assert(*d == 0.0);
free(d);

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

C стандарт намеренно избегает указания способа представления float и double:

6.2.6.1 Общие сведения

  1. представления всех типов не определены, кроме случаев, указанных в этом подпункте.

Таким образом, вы не можете гарантировать, что calloc выдаст 0,0 значений.

Представление целых чисел без знакас другой стороны, определяется следующим образом:

Если имеется N битов значения, каждый бит должен представлять различную степень 2 от 1 до 2 N-1 ,так что объекты этого типа должны быть способны представлять значения от 0 до 2 N - 1 , используя чисто двоичное представление.

Следовательно, значение calloc -edunsugned int гарантированно равно нулю.

0 голосов
/ 14 декабря 2018

Все байты ноль для float не означает 0.0.Начиная с здесь

Инициализация со всеми нулевыми битами не гарантирует, что с плавающей запятой или указателем будет инициализировано значение 0,0 и значение нулевого указателя, соответственно (хотя это вернона всех распространенных платформах)

0 голосов
/ 14 декабря 2018

C11 документация имеет это явное уведомление для calloc

Сноски

296) Обратите внимание, что это не должно совпадать с представлением нуля с плавающей точкой или нуляконстанта указателя.

На практике все нулевые биты являются (или) представлением для 0,0 и нулевым указателем на основных платформах и истинны для IEEE 754.

0 голосов
/ 14 декабря 2018

calloc устанавливает все байты выделенной памяти на ноль.

Как это бывает, это также допустимый IEEE754 (который является наиболее распространеннымформат значений с плавающей запятой на компьютерах) представление для 0.0.

IIRC. В спецификации C нет части, требующей реализации для использования IEEE754, поэтому, чтобы быть разборчивым, она не переносима.В действительности, однако, это так (и если вы когда-нибудь собираетесь работать с системой, отличной от IEEE754, у вас должен был быть достаточный опыт, чтобы уже знать это и решать такие проблемы).

Также обратите внимание, чтоэто также верно для указателей.Во всех системах, с которыми вы можете соприкасаться, нулевой указатель должен быть равен 0.Но могут быть системы, в которых это не так, но если вы работаете в таких системах, вы уже должны знать об этом (и если вы используете NULL, тогда это не должно быть проблемой).

...