C言語の関数の呼び出しについておたずねしたいのですが、

int func(int* p) { int n = 0; /* do something */ *p = n; return n; }
int main() { int n = 0,arrays[16]; arrays[n] = func(&n); }

上記のようなコードを実行した場合、関数funcに渡した実引数nはいつ変更されるのでしょうか?
関数funcからmainに処理が戻った時点で(関数の戻り値が配列に代入される前に)nが変更されている保証はあるのでしょうか?