簡體   English   中英

Memset枚舉數組值設置不正確(C / C ++)

[英]Memset enum array values not setting correctly (C/C++)

我正在嘗試使用memset將枚舉數組中的所有值設置為單個值,但我沒有看到正確的結果。 第一個memset工作,第二個沒有。 我的代碼:

// definitions
#define NUM_THREADS     1

enum ThreadState
{
    INITIALIZING,
    READY_TO_CALCULATE,
    CALCULATED,
    READY_TO_UPDATE,
    UPDATED
};


// Later on, in the code...
ThreadState Thread_States[NUM_THREADS];

// Somehow this works - after this statement, every entry in Thread_States is INITIALIZING
memset(Thread_States, INITIALIZING, NUM_THREADS* sizeof(ThreadState));

// ... later on (or even immediately right after) ...

// Failure - after this statement, every entry in Thread_States is 16843009
memset(Thread_States, READY_TO_CALCULATE, NUM_THREADS* sizeof(ThreadState));

正如評論中所解釋的那樣,我第一次調用memset時,值被設置為我期望的值(INITIALIZING,即0)。 當我運行第二個語句時,我看不到將值設置為READY_TO_CALCULATE(即1)。 相反,當我檢查調試器時,它們被設置為16843009。

有沒有理由相對簡單地使用memset的行為不一致?

謝謝。

memset函數將內存的每個字節設置為第二個參數(在第二個參數被截斷之后)。 由於枚舉(通常)是int的大小,您將得到錯誤的結果。 它唯一有效的時間是枚舉值為零,因為它會將所有字節設置為零。

如果使用例如READY_TO_CALCULATE ,則將每個字節設置為1 ,這將創建int0x01010101而不是0x00000001

你的問題是C還是C ++?

在C的情況下,記住循環遍歷數組以設置每個值,因為memset不適用於此類函數。 你試圖設置元素,而不是內存。

對於C ++,請使用枚舉類作為狀態。 此外,嘗試將線程狀態封裝在自己的管理它的類中,並使默認初始化程序正確構造它。

暫無
暫無

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

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