[英]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.