我试图破译别人的代码,我看到一些我不理解的东西。当成员未在标题中或代码的开头定义但稍后定义时,我没有看到关于如何应用结构的任何引用。这是我想要弄清楚的一个例子。我注意到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;
}
答案 0 :(得分:2)
Data_t
的定义没有出现在您的代码中,这是造成编译错误的原因。
另外 - 对于您的特定问题,该代码取消引用未初始化的指针,这会导致未定义的行为。初始化data
中config
结构中的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;
很好,是一种初始化结构的完全合理的方法。