通过指向结构指针的指针更改变量

时间:2012-07-26 14:35:45

标签: c pointers

我试图通过一个结构来改变一个int变量,该结构常量指向其他结构的指针,其中一个字段就是该变量。 我在编译中收到一个警告和一个错误。任何人都可以解释为什么以及如何使用此代码?

代码是:

typedef struct
{
    struct TEEC_Session *ptr_struct;
} Context_model;

typedef struct
{   int t_S;    
} Session_model;

void Attribution(Context_model* context,Session_model* session )
{
    (*context).ptr_struct = session;  

}

void change_t_S(Context_model* context )
{
    (*(*context).ptr_struct).t_S = 5; // I Want to change t_S to 5 using only the 

context structure

} 

main()
{
Context_model context;
Session_model session;

Attribution(&context,&session);

// Now I want to change t_S using the context 
change_t_S(&context);
}

3 个答案:

答案 0 :(得分:0)

将Context_model的定义修改为

typedef struct
{
    Session_model *ptr_struct;
} Context_model;

并将其移至Session_model的定义之下。

struct TEEC_Session未在您的代码中定义。

答案 1 :(得分:0)

您宣布ptr_struct具有struct TEEC_Session *类型,但之后尝试将其用作Session_model *类型的指针。这是明显的类型不匹配。这没有意义。

什么是struct TEEC_Session?在整个计划中没有提及TEEC_Session。为什么你将ptr_struct字段声明为指向某个完全随机的非常类型struct TEEC_Session的指针,然后完全忘记struct TEEC_Session的存在?

如果您的struct TEEC_Session类型应该与Session_model类型同义,那么您应该告诉编译器。例如,您可以将Session_model声明为

typedef struct TEEC_Session
{   
   int t_S;    
} Session_model;

一切都会按预期运作。

或者,您可以通过重新排序声明来完全删除对TEEC_Session的任何引用

typedef struct
{   
  int t_S;    
} Session_model;    

typedef struct
{
  Session_model *ptr_struct;
} Context_model;

最后,您在代码中使用了C99风格的注释(//)。 C99不允许在没有显式返回类型的情况下声明函数。 main()应为int main()

答案 2 :(得分:0)

我使用附加声明和解引用成语的指针显示代码。

这在C,HTH编译好。

struct TEEC_Session;

typedef struct
{ struct TEEC_Session *ptr_struct;
} Context_model;

typedef struct TEEC_Session
{ int t_S;
} Session_model;

void Attribution(Context_model* context,Session_model* session )
{
    context->ptr_struct = session;
}

void change_t_S(Context_model* context )
{
    context->ptr_struct->t_S = 5; // I Want to change t_S to 5 using only the context structure
}

int main_change_var(int argc, char **argv)
{
    Context_model context;
    Session_model session;

    Attribution(&context,&session);

    // Now I want to change t_S using the context
    change_t_S(&context);

    return 0;
}