2013-03-18 2 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 гарантировали бы крах, который я считаю. –

+0

@ Magtheridon96 Это также UB: http://stackoverflow.com/questions/2727834/c-standard-dereferencing-null-pointer-to-get-a-reference –

+0

Возможный дубликат [Неинициализированные указатели в коде] (http: //stackoverflow.com/questions/5870038/uninitialized-pointers-in-code) – ecatmur

ответ

1

Поскольку int является базовым типом, то почему бы не просто ...

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

0

Что вы делаете, полагаясь на удачу: неинициализированное int *temp; использует некоторый мусор из стека, и если вы повезло, это разыгрывание приведет к сбою программы с SIGSEGV (AccessViolation в Windows), в противном случае (и это намного хуже!) это портит некоторые данные о местоположении в памяти, которые могут иметь решающее значение для программы, но это проявится намного позже как таинственный geizenbug ,

Таким образом, поведение неинициализированного указателя полностью зависит от состояния стека, которое является практически случайным: в зависимости от того, какие функции были вызваны раньше, и какого количества данных они использовали и их локальных переменных.

Смежные вопросы