2016-12-03 15 views
0

мне было интересно, если бы вы могли сказать мне, когда вы в состоянии вернуть NULL, как результат функции в С.Когда вы можете вернуть NULL в качестве возвращаемого значения функции C?

Например int lenght() не может вернуться NULL, потому что это ожидает в обратном заявлении об int.

Но функция struct node* find(int key), при работе со связанными списками позволяет мне возвращать NULL.

+1

Указатель против не указатель. «NULL» - значение нулевого указателя. –

+0

http://stackoverflow.com/questions/27096623/unable-to-return-null-in-a-function-that-expects-an-integer-return-type Эта ссылка поможет вам –

ответ

4

NULL - значение указателя - вернее, значение нулевого указателя.

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

Если вы пишете рутинную

int length() 

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

0

NULL определенно указатель. Поэтому, если ожидается, что ваша функция вернет указатель и по какой-то причине не сможет, он должен вернуть очевидный «недопустимый указатель», который является NULL.

+2

@alk Стандарт: * Целочисленное константное выражение со значением 0 или такое выражение, переданное типу void *, называется константой нулевого указателя *. Не говорите мне, что «константа нулевого указателя» не указатель, пожалуйста. – tofro

+0

Ну да, справедливо. – alk

3

Это вопрос конвенции и вы должны четко иметь один в вашей голове и документ (по крайней мере, в комментариях).

Иногда указатель действительно должен всегда указывать на действительный адрес (см. Пример thisintSwap, оба аргумента должны быть действительными указателями). В других случаях он должен быть либо таким действительным адресом, либо быть NULL. Концептуально тип указателя тогда по соглашению a sum type (между подлинными адресами указателей и специальным значением NULL).

Обратите внимание, что язык C не имеет типа (или обозначения), который гарантирует, что определенный указатель всегда действителен и не равен нулю. BTW, с GCC, вы можете annotate a function с __attribute__ с использованием nonnull, чтобы выразить, что данный аргумент никогда не является нулевым.

Типичный пример: FILE* указатели в <stdio.h>. Функция fopen документирована, чтобы иметь возможность возвращать NULL (при сбое) или какой-либо действительный указатель. Но функция fprintf ожидает действительный указатель (и минус NULL ему первый аргумент undefined behavior, часто segmentation fault; и UB действительно bad).

Некоторые непереносимые программы используют даже несколько специальных значений указателя (которые не должны быть разыменованы), например. (на Linux/x86-64) #define SPECIAL_SLOT (void*)((intptr_t)-1) (что мы знаем, что на Linux это никогда не действительный адрес).Тогда мы могли бы иметь соглашение о том, что указатель является действительным указателем на действительную зону памяти или NULL или SPECIAL_SLOT (следовательно, если он рассматривается как abstract data type, это тип суммы двух разных недействительных указателей NULL и SPECIAL_SLOT и набор действительных адреса). Другим примером является MAP_FAILURE как результат mmap(2) на Linux.

Кстати, при использовании указателей в C осыпать выделенные данные (косвенно полученные с malloc), необходимы также соглашениями о том, кто отвечает за отпуская данные (с помощью free, часто через введённую функцию, чтобы освободить данные и все его внутренние вещи).

Хорошего программирование C требует много явных конвенций относительно указателей, и очень важно, чтобы понять их точно и документировать их. Посмотрите пример [s] на GTK. Читайте также о restrict.

1

Когда вы в состоянии вернуть NULL в качестве возвращающей значения функции C

В общем, если и только если функция возвращает тип указателя:

T * function(<parameter definitions> | void>); /* With T being any valid type. */ 

Существуют другие, угловые шкафы, которые зависят от используемой реализации C.

0

NULL, может быть определен как или (недействительными *) 0 (См 6.3.2.3p3 и 7.19p3).

Следовательно, она может быть всегда используются в качестве возвращаемого значения в функциях, возвращающих тип указателя, и в зависимости от реализации, может быть потенциально могут быть использовано в качестве возвращаемого значения в функции возвращающего числовых типов, хотя последнее плохая идея, так как ожидается, что NULL будет использоваться совместно с указателями.

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

  • Нет связанных вопросов^_^