簡體   English   中英

使用memset初始化float數組

[英]Initializing a float array with 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()函數做錯了什么。 我希望這不是一個重復的帖子,因為我輸入的內容似乎沒有任何建議的相關問題。

Memset采用int,但將其轉換為unsigned char,然后使用該位模式填充float的每個字節(sizeof(float)可能為4)。 如果這是c ++,請選擇填充

#include <algorithm>
using namespace std;

//...

fill (arry,arry+3,10.0);

將double轉換為int只會創建二進制數00001010(二進制10),這是memset的值。 因為它是一個char,所以每個浮點數實際上都是接收位模式00001010 00001010 00001010 00001010。

編號memset需要一個字節並將其寫入數組。 float是一種多字節類型。

編輯:是的,我知道memset需要一個int。 但它只使用無符號字符(單個字節)來填充。

為什么不只是一個簡單的for循環?

實際上你的嘗試有點誤導,memset工作在字節上..實際上使用浮點數為memset值沒有任何意義!

浮點格式只有23 + 1位用於尾數,8位用於指數..當你在浮點數內寫入原始字節值(使用memset)時,你不知道你得到了什么,因為你設置了將被解釋的值另一種方式!

在你的代碼片段中,你還將它轉換為(int)將包含10.0f的4字節浮點數轉換為包含值10的4字節整數。但如前所述,如果你設置一個10(= 0x0a)的浮點數,你將會最終獲得浮點格式不是10.0f的0x0A0A0A0A,它可以是任何值(也非常接近0,就像你的情況一樣)。

實際上,當你想要初始化一個字符數組時, memset非常有用(因為你有效地獲得每個字符的值,因為它們長1個字節),或者當你想將所有字符串設置為0(NULL)時,它適用於每種基本類型的數據..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM