Инициализация массива с плавающей запятой с помощью memset
Вопрос
Это код, который я хочу попытаться написать:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char *argv[])
{
float arry[3] = {0};
memset(arry, (int) 10.0, 3*sizeof(float));
return 0;
}
Моя проблема в том, что я хочу посмотреть, возможно ли использовать memset, чтобы каждая запись массива была числом, отличным от 0.Однако после перехода через эту строку содержимое массива изменяется на очень маленькое число (0).Интересно, что я делаю не так в этом случае с использованием функции memset().Я надеюсь, что это не дублирующий пост, поскольку ни один из предложенных связанных вопросов, когда я набираю это, похоже, не соответствует.
Решение
При преобразовании типа double к int просто создается двоичное число 00001010 (10 в двоичном формате), и это значение, которое задано в memset'е. Поскольку это символ, каждый из ваших чисел с плавающей точкой получает битовую комбинацию 00001010 00001010 00001010 00001010.
Другие советы
Нет.memset принимает один байт и записывает его в массив.Float - это многобайтовый тип.
Редактировать:Да, я знаю, что memset принимает значение int.Но для заполнения он использует только символ без знака (один байт).
Почему бы не просто цикл for
?
На самом деле ваша попытка немного вводит в заблуждение, memset работает с байтами ... на самом деле использование значения float для значения memset не имеет никакого смысла! Р>
Формат с плавающей запятой имеет только 23 + 1 бит для мантиссы и 8 бит для экспоненты. Когда вы записываете необработанные байтовые значения (используя memset) внутри плавающей запятой, вы не знаете, что получаете, потому что вы устанавливаете значения, которые будут быть интерпретированным по-другому!
В своем фрагменте вы также приводите его к (int), превращая 4-байтовое число с плавающей запятой, содержащее 10,0f, в 4-байтовое целое число, содержащее значение 10 .. но, как уже было сказано, если вы устанавливаете значение с плавающей запятой с 10 (= 0x0a) в итоге вы получите 0x0A0A0A0A, который не равен 10.0f в формате с плавающей запятой, это может быть любое значение (также что-то очень близкое к 0, как в вашем случае).
На самом деле memset
полезен, когда вы хотите инициализировать массив символов (поскольку вы эффективно получаете это значение для каждого символа, потому что они имеют длину 1 байт) или когда вы хочу установить все в 0 (NULL), который работает для всех основных типов данных.