我正在尝试使用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的行为不一致?
谢谢。
答案 0 :(得分:9)
memset
函数将内存的每个字节设置为第二个参数(在第二个参数被截断后)。由于枚举(通常)int
的大小,您将得到错误的结果。它唯一有效的时间是枚举值为零,因为它会将所有字节设置为零。
如果您使用例如READY_TO_CALCULATE
您将每个字节设置为1
,这将创建int
0x01010101
而不是0x00000001
的值。
答案 1 :(得分:1)
你的问题是C还是C ++?
在C的情况下,记住循环遍历数组以设置每个值,因为memset不适用于此类函数。你试图设置元素,而不是记忆。
对于C ++,请为状态使用枚举类。此外,尝试将您的线程状态封装在自己的管理它的类中,并使默认的初始化程序正确构造它。