修改使用C中的typedef构造的MyType时出错

时间:2012-04-17 21:06:30

标签: c struct typedef

我创建了一个类型并尝试更改其中的int值。 但它继续打印240。 我不知道为什么,任何人都可以帮助我吗? 这是我的代码:

typedef struct{
   int i;
}MyType;

do(MyType mt, int ii){
   mt.i = ii;
}

int main(int argc, char ** argv){
    MyType mt;
    do(mt, 5);
    print("%d\n", mt.i);
}

2 个答案:

答案 0 :(得分:3)

将值mt传递给函数do()。所做的任何更改都将是函数的本地更改。传递mt的地址:

void do_func(MtType* mt, int ii){
    mt->i = ii;
}

MyType mt;
do_func(&mt, 5);

答案 1 :(得分:1)

首先,您的do函数存在一些问题。您未能指定返回类型,因此假定为int(在C99之前),但我认为没有理由不指定它。其次,do是C中的保留关键字。

您正在按值传递结构,因此会制作副本,传递给do函数, 会被修改。一切都在C,期间以值传递。永远不会触及mt中声明的main变量。

如果需要修改一个或多个成员变量,请在代码中使用MyType*,如果需要为结构本身分配内存(即初始化指针),请选择MyType**

// pass a pointer to the function to allow
// for changes to the member variables to be 
// visible to callers of your code.
void init_mytype(MyType *mt, int ii){
    if(mt)
        mt->i = ii;
}

MyType mt;
init_mytype(&mt, 1);

// pass a pointer to pointer to initialize memory
// for the structure and return a valid pointer.
// remember, everything is passed by value (copy)
void init_mytype(MyType **mt, int ii) {
    if(mt) {
        *mt = malloc(sizeof(MyType));
        if(*mt) 
            (*mt)->i = ii;
    }
}

MyType *pmt;
init_mytype(&pmt, 1);