0

型を作成し、その中の 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);
}
4

2 に答える 2

3

mt関数に値を渡すdo()。加えられた変更は、関数に対してローカルになります。のアドレスを渡しますmt

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

MyType mt;
do_func(&mt, 5);
于 2012-04-17T21:09:19.823 に答える
1

まず、do関数に問題があります。戻り値の型の指定に失敗したため、int が想定されます (C99 以前) が、単に指定しない理由はありません。2 つ目doは、C の予約済みキーワードです。

構造体を値で渡しているため、コピーが作成されてdo関数に渡され、それが変更されます。C では、すべてが値によって渡されます。ピリオド。mtで宣言された変数mainは決して変更 されません。

MyType*1 つまたは複数のメンバー変数を変更する必要がある場合はコード内でaMyType**を使用し、構造体自体にメモリを割り当てる (つまり、ポインターを初期化する) 必要がある場合は a を使用します。

// 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);
于 2012-04-17T21:10:44.003 に答える