具有枚举类型的多维数组,并将它们转换为unsigned char数组

时间:2013-10-29 06:27:56

标签: c arrays multidimensional-array casting enums

这是代码。

#include <stdio.h>
#define N 3
#define COPY(a, i) (a[(i)]) = (a[((i)+1)])

enum course {BTP300 = 1, OOP244, OOP344, OOP444, BTP400 = 8, BTP500};
typedef enum course Course;

void display(void* a, int n) {
    int i;
    unsigned char* c = (unsigned char*)a;

    for (i = 0; i < n; i++)
        printf("%d ", c[i]);
    printf("\n");
}

void process(void *c, int n, int s) {
    int i, j;
    unsigned char* a = (unsigned char*)c;

    for (i = 0; i < s * n; i++) {
        unsigned char x = a[i];
        for (j = 1; j < s - 1; j++, i++)
            COPY(a, i);
        a[++i] = x;
    }
}

int main() {
    Course array[2][N] = {BTP300, BTP400, BTP500, OOP244, OOP344, OOP444};

    display(array[1], sizeof(Course)*N);
    display(array[0], sizeof(Course)*N);
    process(array[0], N, sizeof(Course));
    process(array[1], N, sizeof(Course));
    display(array[1], sizeof(Course)*N);
    display(array[0], sizeof(Course)*N);
    return 0;
}

输出是:

2 0 0 0 3 0 0 0 4 0 0 0
1 0 0 0 8 0 0 0 9 0 0 0
0 0 0 2 0 0 0 3 0 0 0 4
0 0 0 1 0 0 0 8 0 0 0 9

现在在投射指针时看起来像是大小发挥作用。我最初认为虽然创建了内存,但是在数组中你只是跳过了。所以我仍然会得到234.但没有。我得到1byte char。

0 2
1 0
2 0
3 0

这也得到印刷。

最近怎么回事?

1 个答案:

答案 0 :(得分:0)

枚举值在C中的类型为int,而int在大多数平台上通常为四个字节(32位)。因此,尝试以char方式访问这些值无法获得预期的结果。

对于display函数,您不需要乘以sizeof(Course),条目数为N,因此您应该为函数提供的大小为:

display(array[1], N);

当然,您应该使用int作为单独的值,或Course

您还需要重新考虑process功能。