まず、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);