是否可以将指针传递给C中的结构?

时间:2012-08-19 13:56:42

标签: c pointers

我从main调用函数init_latent_variables并将指针传递给sample类型的结构SAMPLE

int main(){
    SAMPLE sample;
    sample = read_struct_examples();
    init_latent_variables(&sample);
    return 0;
}

SAMPLE read_struct_examples() {
    SAMPLE sample;        
    sample.examples = (EXAMPLE *) malloc(1*sizeof(EXAMPLE));
    if(!sample.examples) die("Memory error.");
    return(sample); 
}

以下是功能定义。内存分配在此函数中正常工作,但main中的原始变量保持不变。

void init_latent_variables(SAMPLE *sample) {
    sample->examples[0].h.h_is = (int *) malloc(5*sizeof(int));
    if(!sample->examples[0].h.h_is) die("Memory error.");       
}

以下是结构定义:

typedef struct latent_var {
  int *h_is;
} LATENT_VAR;

typedef struct example {
  LATENT_VAR h;
} EXAMPLE;

typedef struct sample {
  EXAMPLE *examples;
} SAMPLE;

我是否正确传递指向struct的指针。是否可以在C中这样做?

更新:不确定之前有什么问题。清洁和重新编译似乎工作。感谢和浪费你的时间道歉。已经标记了问题,以便版主可以删除它。

2 个答案:

答案 0 :(得分:0)

您在分配sample->examples之前取消引用{/ 1}}:

void init_latent_variables(SAMPLE *sample) {
    sample->examples[0].h.h_is = (int *) malloc(5*sizeof(int));
    if(!sample->examples[0].h.h_is) die("Memory error.");       
}

这应该是:

void init_latent_variables(SAMPLE *sample, int num_examples) {
    sample->examples = (EXAMPLE *) malloc(sizeof EXAMPLE * num_examples);
    if(!sample->examples) die("Memory error.");   
    sample->examples[0].h.h_is = (int *) malloc(5*sizeof(int));
    if(!sample->examples[0].h.h_is) die("Memory error.");       
}

考虑使用calloc()而不是malloc,或者在使用之前使用memset将结构清除为0。

答案 1 :(得分:0)

首先,您必须分配SAMPLE结构的示例成员...据我所知它必须是一个对象数组...当然,在C中没有引用,只有“值”或“指针”