在不定义结构成员的情况下初始化结构 - C.

时间:2011-01-03 22:24:14

标签: c structure

我试图破译别人的代码,我看到一些我不理解的东西。当成员未在标题中或代码的开头定义但稍后定义时,我没有看到关于如何应用结构的任何引用。这是我想要弄清楚的一个例子。我注意到Data_t *数据;在我们输入funky函数并且我的编译器在此行上出错之前,标题中没有定义。我想我的问题是 - 这是将数据输入结构的有效方法吗?

非常感谢!

#include <stdio.h>

typedef struct config{
    int a;
    int b;
    int c;
    Data_t *data;
} config_t;

int funky(config_t *config);

int main( void )
{
    printf("In main()\n");
    config_t config;
    funky(&config);

    printf("a = %d\n", config.a);   //accessing config's a member

    return 0;
}

int funky(config_t *config)
{
    printf("In funky()\n");

    Data_t *dataa = config->data;
    for(i=0;i<5;i++){
        dataa[i].mem1=i;
        dataa[i].mem2=4+i;
    }

    //Set values
    config->a = 1;
    printf("a = %d\n", config->a);  //pointer to config's a member

    return 0;
}

1 个答案:

答案 0 :(得分:2)

Data_t的定义没有出现在您的代码中,这是造成编译错误的原因。

另外 - 对于您的特定问题,该代码取消引用未初始化的指针,这会导致未定义的行为。初始化dataconfig结构中的main字段,否则您将遇到麻烦。这段代码:

Data_t *dataa = config->data;
for(i=0;i<5;i++){
    dataa[i].mem1=i;
    dataa[i].mem2=4+i;
}

是不好的东西 - 正如你所看到的,它将单元化指针复制出去并尝试通过它访问内存。

之后的代码:

//Set values
config->a = 1;

很好,是一种初始化结构的完全合理的方法。

相关问题