- 【初心者歓迎】C/C++室 Ver.92【環境依存OK】
736 :デフォルトの名無しさん[sage]:2014/09/22(月) 17:31:20.59 ID:w+/ONFEY - 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が変更されている保証はあるのでしょうか?
|
- 【初心者歓迎】C/C++室 Ver.92【環境依存OK】
739 :デフォルトの名無しさん[sage]:2014/09/22(月) 18:05:05.94 ID:w+/ONFEY - >>737と>>738どっちが本当なんでしょうか?
|
- 【初心者歓迎】C/C++室 Ver.92【環境依存OK】
742 :デフォルトの名無しさん[sage]:2014/09/22(月) 18:27:37.55 ID:w+/ONFEY - 問題を箇条書きにしますと、
1. arrays[n]の位置の決定 2. 関数funcの評価 3. 決定した配列の位置への値の代入 がどういう順番になるかで実行結果がどうなるかが違ってくると思います arrays[n]の位置が関数の呼び出し前に決定されると誤った位置に値が代入されるか又はアクセス違反になるかも? arrays[n]の位置の決定が関数の呼び出しの後だとしても、最適化の問題等により[]演算子の評価の後にnが更新されるかも? fun()を呼び出した際に確実にnが変更されて、その後に配列にアクセスしないとアクセス違反であぼーんしそう 式の評価順がどうとか、副作用完了点がどうとか、調べても分かりません・・・
|