2013-10-11 35 views
0

下面是代碼:memset的設定隨機值

#include <iostream> 
#include <cstring> 

int main() 
{ 
    int win[11]; 
    std::memset(win, 1, sizeof(win)); 
    for (int i = 0; i < 11; ++i) 
     std::cout << win[i] << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

我認爲這是不符合邏輯的缺陷嗎?但不是打印一串1,我得到了16843009

如果我將memset更改爲std::memset(win, 0, sizeof(win))。然後一切都如預期。勝利的內容全部爲零。

我在這裏錯過了什麼嗎?我正在g++ 4.7.3Ubuntu 13.04

對不起,這個重複的問題。

這是答案。由於

Why does "memset(arr, -1, sizeof(arr)/sizeof(int))" not clear an integer array to -1?

+0

我可以將自己的問題標記爲重複嗎? – gongzhitaao

+0

@DyP是的。我有不同的關鍵字,所以直到幾分鐘前我才發現它 – gongzhitaao

+0

(該評論已自動創建,因爲我投票結束爲dup。) – dyp

回答

8

int S鍵通常是四個字節長。但是memset設置了單個字節的值,因此您將每個值設置爲0x01010101,這恰好等於16843009.

+1

在這個特定平臺上的「整數是四個字節長」。 – dyp

+0

@DyP是的,我想我應該澄清... –

3

memset函數寫入內存時未以任何方式理解其結構。如果你在會計報告中寫了一大堆隨機的1,那報告會顯示該公司花了1美元嗎?我不這麼認爲。也許它會顯示111111美元。也許不會。誰知道。

要智能地修改對象的值,必須瞭解其結構。 memset函數不理解win的結構,只是在其字節上全部塗寫1。這意味着什麼,memset不知道或關心。