关于C#:用指针交换变量

swapping variables with pointers

1
2
3
4
5
6
void swap (int *px, int *py) {
int temp;
temp = *px;
*px = *py;
*py = temp;
}

这将交换两个变量,这对我来说很好。

如果我把它改成

1
2
3
4
5
6
void swap (int *px, int *py) {
int *temp;
*temp = *px;
*px = *py;
*py = *temp;
}

注意:内部温度

尽管如此,这仍然有效,但是temp在未初始化的情况下被取消引用。

这有什么用呢?

比如,如果我想创建一个名为proc的方法,我怎么能保证程序会崩溃呢?我想我应该把东西放在书堆上。

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


既然int是基型,为什么不…

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


你所要做的就是靠运气:未初始化的int *temp;使用堆栈中的一些垃圾,如果你运气好的话,它的解引用将使程序与sigsegv(windows上的accessviolation)崩溃,否则(情况更糟!)它破坏了一些现有内存位置的数据,这些数据可能对程序至关重要,但稍后它将作为一个神秘的GeizenBug出现。

因此,未初始化指针的行为完全取决于堆栈的状态,这实际上是随机的:取决于以前调用过哪些函数,使用了多少数据以及它们的局部变量。