2011-07-16 3 views
0

Я столкнулся с некоторым кодом, на который я не мог найти ответ на Google или SO. Я смотрю на функцию потока, которая возвращает void *, как вы могли ожидать. Однако, прежде чем функция резьбы закончится, он внезапно потянет этот трюк,Какова цель этого возвращаемого значения?

return (void*) 0; 

В чем его цель? Я не могу понять.

редактировать:

Поняв это то же самое, как NULL-- это моя мысль, они использовали это, чтобы пропустить включая STDLIB.

+2

Это так же, как 'return NULL;' - почему это проблема? Может быть, вам стоит больше написать код? –

+0

Я никогда не видел этого раньше - это действительно так распространено? –

+0

Конечно - почему бы и нет? Может быть, в функции есть одно или несколько операторов возврата, которые возвращают указатель не-NULL? Мы не будем знать, если вы не разместите больше кода ... –

ответ

3

(void*)0 является нулевым указателем, а.к.а. NULL (который на самом деле представляет собой макрос, определенный в нескольких заголовочных файлах, например stddef.h или stdio.h, что в основном сводится к тому же, как (void*)0).

Update:

Как объяснить нулевые указатели и их полезность? В принципе, это особое значение, которое говорит: «Этот указатель нигде не указывает» или «Этот указатель не установлен в действительную ссылку на объект».

Историческая справка: Хоар, который, как говорят, изобрел неопределенные ссылки в 1965 году, как известно, сожалеем, что изобретение и, таким образом, называет его "Billion Dollar Mistake":

Всякий раз, когда вы работаете с указателями, вы должны убедиться, что никогда разыменовать нулевой указатель (потому что он не ссылается ни на что по определению). Если вы все равно это сделаете, вы либо получите ненормальное завершение программы, либо общую ошибку защиты, либо неожиданное поведение программы, по крайней мере.

+0

Есть ли практическая причина для возврата null из потока? –

+0

Отличный ответ stakx :) –

1

Ну, я не обнаружил никакого C++ компилятора, говорящего NULL или 0 не может быть преобразован в void* (или в/из int*, например). Но могут быть некоторые интеллектуальные компиляторы или инструменты статического анализа, которые сообщали бы об ошибке 0 to void-pointer как предупреждение.

Это утверждение обычно встречается в реализации обратного вызова (например, в поточной программе), которое должно соответствовать прототипу требуемого обратного вызова (pthread_create, CreateThread и т. Д.). Поэтому, когда вы реализуете эту функцию, вы должны возвращать тот же тип, для которого он требовался. Для pthread_createрутинной, вы должны вернуть void* - и поэтому return (void*)0; есть.

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