1

個人的なプロジェクトのプログラミング中に、ある関数へのポインターを渡したときに、その値を変更できないことがわかりました。例:

...
GString *buf = NULL;
buf = g_string_sized_new(64);
somefunc(buf, filename);
...

void somefunc(GString *buf, gchar *filename)
{
    buf = otherfunc(filename); //otherfunc() returns a GString *
}

デバッガーを監視した後、バッファー実行のメモリ割り当て時に、buf = 0x80b720およびotherfunc()が0x80b750を返すことを確認しました。バッファの値は変更されませんでしたが。それで、なぜこれが起こるのか、そしてこれがmalloc()の一般的な特徴であるかどうか誰かが知っているかどうか尋ねたいと思います。つまり、malloc()呼び出しによって返されたポインターを関数に渡すと、この値を関数本体の内部または外部で変更できますか?

4

1 に答える 1

8

これはとは何の関係もありませんmalloc

関数へのポインターを渡すと、関数は元のポインターのコピーを受け取ります。ポインタの独自のコピーを変更することはできますが、元のポインタを変更することはできません。

元のポインターを変更する場合は、元のポインターのアドレスを渡す必要があります。元のポインターは、ポインターへのポインターとして受け取ります。

void somefunc(GString **buf, gchar *filename) { 
    *buf = otherfunc(filename);
}
于 2012-07-18T00:49:12.800 に答える