sizeof报告错误的价值

时间:2014-03-13 15:09:03

标签: c

我正在尝试使用sizeof(_test.header.columns)/sizeof(struct _column)从我自己的结构中获取“列”元素。不幸的是,我总是将其作为0,因为sizeof(_test.header.columns)始终为4。这是代码:

struct _column{
    char title[40];
    int length;
};

struct test_struct{

    struct{
        struct _column* columns;
    }header;

    struct{
        struct _column* columns;
    }details;

    struct{
        struct _column* columns;
    }end;
};

struct test_struct _test = {

    .header = {
        .columns = {
            {
                "a",
                1,
            },
            {
                "ab",
                2,
            },
        },
    },
    .details = {
        .columns = {
            {
                "b",
                2,
            },
            {
                "bc",
                3,
            },
        },
    },
    .end = {
        .columns = {
            {
                "c",
                3,
            },
            {
                "cd",
                4,
            },
        },
    },
};

void testme(){
    char buff[20];
    itoa(sizeof(_test.header.columns)/sizeof(struct _column),buff,sizeof(buff));
    MessageBoxA(NULL,buff,NULL,NULL);
}

请帮我解决问题,谢谢。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

它失败的原因是你正在检查指针的sizeof,它返回指针的大小,而不是内存地址指向的实际数组。

如果你知道数组的最大长度,你可以这样声明:

_column[ integerSize ]

但是如果你知道大小,你就不会使用sizeof来查询它,我想;-)你可以通过添加描述列数组大小的int类型的另一个属性来扩展struct吗?

答案 1 :(得分:0)

您可能会尝试按照以下方法执行相同类型的初始化,但是您将列计数本身包含在其中。

struct _column{
    char title[40];
    int length;
};

struct test_struct{

    struct{
        struct _column* columns;
        int    nColumns;
    }header;

    struct{
        struct _column* columns;
        int    nColumns;
    }details;

    struct{
        struct _column* columns;
        int    nColumns;
    }end;
};

struct _column headerColumns [] = {
            {
                "a",
                1
            },
            {
                "ab",
                2
            }
        };

struct _column detailColumns[] = {
            {
                "b",
                2
            },
            {
                "bc",
                3
            },
        };

struct _column endColumns [] = {
            {
                "c",
                3
            },
            {
                "cd",
                4
            }
        };

struct test_struct _test = {
    { headerColumns, sizeof(headerColumns)/sizeof(headerColumns[0])},
    { detailColumns, sizeof(detailColumns)/sizeof(detailColumns[0])},
    { endColumns, sizeof(endColumns)/sizeof(endColumns[0])}
};