Memset枚举数组值设置不正确(C / C ++)

时间:2014-01-25 22:25:03

标签: c++ c arrays enums memset

我正在尝试使用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的行为不一致?

谢谢。

2 个答案:

答案 0 :(得分:9)

memset函数将内存的每个字节设置为第二个参数(在第二个参数被截断后)。由于枚举(通常)int的大小,您将得到错误的结果。它唯一有效的时间是枚举值为零,因为它会将所有字节设置为零。

如果您使用例如READY_TO_CALCULATE您将每个字节设置为1,这将创建int 0x01010101而不是0x00000001的值。

答案 1 :(得分:1)

你的问题是C还是C ++?

在C的情况下,记住循环遍历数组以设置每个值,因为memset不适用于此类函数。你试图设置元素,而不是记忆。

对于C ++,请为状态使用枚举类。此外,尝试将您的线程状态封装在自己的管理它的类中,并使默认的初始化程序正确构造它。