簡體   English   中英

使用 memset 初始化整個數組

[英]Initializing entire array with memset

我已經用值 1 初始化了整個數組,但輸出顯示了一些垃圾值。 但是,如果我使用 0 或 -1 代替 1,則該程序可以正常工作。那么,對於可以使用 memset 初始化的值類型有一些限制嗎?

 int main(){
    int a[100];
    memset(a,1,sizeof(a));
    cout<<a[5]<<endl;
    return 0;
    }

換句話說,memset 將數組的每個字節設置為指定的值。

這適用於 0 和 -1 的原因是因為兩者都在任意大小上使用相同的重復模式:

(int) -1 is 0xffffffff
(char) -1 is 0xff

所以用0xff填充內存區域將有效地用 -1 填充數組。

但是,如果你用1填充它,你將每個字節設置為0x01 因此,這與將每個整數設置為值0x01010101 ,這不太可能是您想要的。

Memset 填充字節,來自cppreference

將值 ch 轉換為 unsigned char 並將其復制到 dest 指向的對象的每個第一個 count 字符中。

您的int需要幾個字節,例如 32 位 int 將填充 1,1,1,1(在基數 256 中,在這種情況下字節序無關緊要),然后您錯誤地將其解釋為“垃圾”值。

其他答案已經解釋了std::memset 但最好避免使用此類低級功能並在更高級別上編程。 所以只需使用標准庫及其 C++11 std::array

#include <array>

std::array<int, 100> a;
a.fill(1);

或者,如果您更喜歡 C 風格的數組,仍然使用帶有std::fill算法的標准庫,如@BoPersson 所示

#include <algorithm>
#include <iterator>

int a[100];
std::fill(std::begin(a), std::end(a), 1);

在大多數實現中,如果這樣做是安全的,兩個版本都會調用std::memset

memset 是一種設置的操作。

如果要設置值,請使用 for 循環。

考慮一個 4 位整數:

當位為 0001 時其值為 1 但 memset 將其設置為 1111

暫無
暫無

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

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