[英]Using memset and memcpy correctly to initialize a character array in 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
,這將創建int
值0x01010101
而不是0x00000001
。
你的問題是C還是C ++?
在C的情況下,記住循環遍歷數組以設置每個值,因為memset不適用於此類函數。 你試圖設置元素,而不是內存。
對於C ++,請使用枚舉類作為狀態。 此外,嘗試將線程狀態封裝在自己的管理它的類中,並使默認初始化程序正確構造它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.