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

Roc*_*mir 0 c enums if-statement

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

enum day
{
    Monday = 'M',
    Tuesday = 'T',
    Wednesday = 'W'
}
Run Code Online (Sandbox Code Playgroud)

2d arraydays

typedef enum day availDays[numOfWeeks][daysOfWeek];
memset(theArray, Monday, sizeof(theArray));
Run Code Online (Sandbox Code Playgroud)

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

if ( theArray[0][0] == Monday )
    { foo statements; }
Run Code Online (Sandbox Code Playgroud)

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

bol*_*lov 5

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

这是因为虽然您将每个枚举值设置为a char,但枚举的基础类型不是char.它(很可能)int.

这就是为什么memset不起作用的原因.它将元素的每个字节设置为"M".因此,每个元素将是值'M'的4个字节的"串联".

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

0x4D0000004D000000...
Run Code Online (Sandbox Code Playgroud)

memset 设置为:

0x4D4D4D4D...
Run Code Online (Sandbox Code Playgroud)

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

for (i...)
    for (j...)
        theArray[i][j] = Monday;
Run Code Online (Sandbox Code Playgroud)

故事的道德:memset仅用于char缓冲.char是标准规定的唯一具有正确尺寸1的类型.


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

enum Day : char {
   ...
};

sizeof(Day) == 1; // true    
Run Code Online (Sandbox Code Playgroud)