错误“堆栈变量已损坏”

时间:2015-01-19 16:03:21

标签: c c99

错误"堆栈周围变量BITS已损坏",MSVS 2013,C99。 它为什么不起作用? 如果我分配

NAME[(LENGTH) / CHAR_BIT + 1]

该程序将正常工作。

#include <stdio.h>
#include <limits.h>

#define CREATE_BIT_FIELD(NAME, LENGTH) \
    unsigned char NAME[(LENGTH) / CHAR_BIT + ((LENGTH) % CHAR_BIT) ? 1 : 0]

#define SET_BIT(NAME, N) \
    NAME[(N) / CHAR_BIT] |= ((unsigned char)1 << ((N) % CHAR_BIT))

#define CLEAR_BIT(NAME, N) \
    NAME[(N) / CHAR_BIT] &= (UCHAR_MAX - ((unsigned char)1 << ((N) % CHAR_BIT)))

#define IS_SETTED(NAME, N) \
    (NAME[(N) / CHAR_BIT] & ((unsigned char)1 << ((N) % CHAR_BIT)))

int main(void)
{ 
    CREATE_BIT_FIELD(BITS, 16);

    for (int i = 0; i < 16; i++)
        SET_BIT(BITS, i);

    for (int i = 0; i < 16; i++)
        putchar(IS_SETTED(BITS, i) ? '1' : '0');

    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

unsigned char NAME[(LENGTH) / CHAR_BIT + ((LENGTH) % CHAR_BIT) ? 1 : 0]

总是被评估为1添加括号

unsigned char NAME[(LENGTH) / CHAR_BIT + (((LENGTH) % CHAR_BIT) ? 1 : 0)]
                                      /* ^ here                        ^ and here */

否则将其评估为

((LENGTH) / CHAR_BIT + (((LENGTH) % CHAR_BIT)) ? 1 : 0

因为运营商优先。