if语句中的枚举比较在c中永远不是真的

我正在ansi C开发一个程序,我有一些问题。 我有一个enum

 enum day { Monday = 'M', Tuesday = 'T', Wednesday = 'W' } 

days 2d array days

 typedef enum day availDays[numOfWeeks][daysOfWeek]; memset(theArray, Monday, sizeof(theArray)); 

后来在if语句中使用,如下所示:

 if ( theArray[0][0] == Monday ) { foo statements; } 

但即使数组的每个元素都是Monday ,这个条件永远不会计算为true ,任何想法为什么?

这不起作用的原因是sizeof(enum day) != 1 。 所以你不能使用memset

发生这种情况是因为虽然您将每个枚举值设置为char ,但枚举的基础类型不是char 。 它(很可能)是int

这就是memset不起作用的原因。 它将元素的每个字节设置为“M”。 因此,每个元素将是值’M’的4个字节的“串联”。

假设小端,ASCII字符编码( 'M'0x4D )和sizeof(int) 4 ,数组应该在memmory中如下所示:

 0x4D0000004D000000... 

memset将其设置为:

 0x4D4D4D4D... 

唯一的解决方案是循环遍历数组并单独设置每个元素

 for (i...) for (j...) theArray[i][j] = Monday; 

故事的道德:仅将memset用于char缓冲区。 char是标准规定的唯一具有正确大小1的类型。


虽然问题是关于C ,但是知道C++需要这个的人是很好的,因为从C++11你可以指定enum的基础类型:

 enum Day : char { ... }; sizeof(Day) == 1; // true