次のように、未定義の引数を使用して関数を呼び出すプログラムがあります。
#include <stdargs.h>
... /* code */
int main () {
GArray *garray = g_array_new (FALSE, FALSE, sizeof (char *));
/* the code above initialize the GArray, and say that the garray expect a pointer to char. */
function_name (garray, "arg2", "arg3" /* and so on ... */);
... /* code */
}
「」の間の引数は文字列であるため、function_nameでは次のようになります。
static void function_name (GArray *garray, ...) {
... /* code */
char *data;
data = va_arg (garray, gchar *);
g_array_append_val (garray, data);
... /* code */
}
したがって、データがva_listの引数を指している場合、関数が戻ると、データが指し示しているのは理論的には無効になり、garrayでも同様になります。
(データポインタが、予約されていないメモリアドレスを指しているため、参照がぶら下がっています)。
しかし、それは起こらないようで、プログラムはうまく動作します。なぜ?そして、Cでは、関数に渡される引数はスタックに格納されるので、データポイントはスタック内で実際にメモリに存在しますか?
thnkxたくさん。