2013-03-18 133 views
0
void swap (int *px, int *py) { 
int temp; 
temp = *px; 
*px = *py; 
*py = temp; 
} 

這將交換兩個變量,這對我來說看起來沒問題。用指針交換變量

現在如果我將其更改爲

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

通知INT *臨時

這部作品雖然反正,但溫度而沒有被初始化解引用。

什麼價值又怎會不工作?

一樣,如果我想創建一個名爲PROC方法我怎麼能出示擔保程序會崩潰?我想我應該在堆棧上留下一些東西。

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

這帶來了不確定的行爲就我所知。 解引用和寫入NULL將會保證我相信的崩潰。 – 2013-03-18 20:35:43

+0

@ Magtheridon96它也是UB:http://stackoverflow.com/questions/2727834/c-standard-dereferencing-null-pointer-to-get-a-reference [在代碼未初始化指針](HTTP的 – 2013-03-19 10:14:40

+0

可能重複: //stackoverflow.com/questions/5870038/uninitialized-pointers-in-code) – ecatmur 2013-03-19 10:48:18

回答

1

由於int是一個基本類型,爲什麼不......

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

0

你要做的就是依靠好運氣:未初始化的int *temp;使用一些垃圾從堆棧中,如果你足夠幸運的話,它的解引用會使程序崩潰與SIGSEGV(在Windows AccessViolation),否則(和它的差多了!),它敗壞了一些現有的內存位置的數據,有可能對程序至關重要,但它更晚將顯示爲一個神祕geizenbug 。

所以未初始化的指針的行爲完全依賴於堆棧,這幾乎是隨機的狀態:這取決於哪些職能已經調用之前,他們使用什麼數據量和它們的局部變量。