0
void swap (int *px, int *py) {
int temp;
temp = *px;
*px = *py;
*py = temp;
}

これで 2 つの変数が交換されますが、これは問題ないように見えます。

今私がそれを

void swap (int *px, int *py) {
int *temp;
*temp = *px;
*px = *py;
*py = *temp;
}

注意 int *temp

とにかくこれは機能しますが、 temp は初期化されずに逆参照されます。

これが機能しない値は何ですか?

たとえば、proc というメソッドを作成したい場合、どうすればプログラムがクラッシュすることを保証できますか? スタックに何かを残すことになっていると思います。

int main () {
int a = 1, b = 2;
proc(/* Some args might go here */);
swap(&a, &b);
}
4

2 に答える 2

1

はベースタイプなのでint、どうして...

void swap (int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; }

于 2013-03-19T11:07:06.393 に答える
0

あなたがしていることは幸運に頼っています: 初期化されていないint *temp;ものはスタックからいくつかのガベージを使用し、運が良ければ、逆参照は SIGSEGV (Windows では AccessViolation) でプログラムをクラッシュさせます。プログラムにとって重要な場所のデータですが、後で謎のガイゼンバグとして表示されます。

したがって、初期化されていないポインターの動作は、スタックの状態に完全に依存します。これは実質的にランダムです。以前に呼び出された関数と、それらが使用したデータの量とそれらのローカル変数に依存します。

于 2013-03-19T11:11:25.273 に答える