Указатель, указывающий на пустой массив
У меня есть указатель, указывающий на начало массива, но мне нужно проверить, что он нераспределен. Я подумал о разыменовании указателя и проверке, если NULL, но это приводит к ошибке типа. Кто-нибудь видит, что я делаю не так?
int mydispose(int *array){
int i = 0;
if(*array == NULL){
return 1;
}
return ;
}
EDIT: Извините, если я был неясен: у меня есть указатель, который указывает на начало массива, но я хочу проверить, пуст ли массив.
6 ответов
*array == NULL
- Это неправильно. Сначала вы разыменовываете указатель (что может привести к segfault, если указатель действительно равен null), а затем сравниваете его значение int со значением указателя. Более того, ваш компилятор прекрасно примет это ошибочное выражение, Если NULL
определяется как просто 0
, а не (void *) 0
.
вы должны проверить array == NULL
чтобы увидеть, относится ли переданный указатель к чему-либо, а затем разыменовать его только в случае, если это не NULL
.
будьте в курсе, однако разыменование ненулевого указателя также не гарантируется как безопасная операция. Если указатель содержит значение мусора, поскольку он был выделен в стеке и не инициализирован, или если он ссылается на освобожденную область памяти, могут произойти неприятные ошибки.
вы хотите if (array == NULL)
-- но если вы сначала инициализировать array
to NULL
, это тоже не принесет никакой пользы. Я думаю, вам лучше отступить и рассказать нам немного больше о том, чего вы пытаетесь достичь, и попытаться получить помощь, пытаясь достичь вашей общей цели.
единственный безопасный способ определить статус распределения *array
- Это:
- убедится
*array
имеет значение NULL не выделяется.int *array = NULL;
- проверьте, является ли массив NULL:
if (array == NULL) return -1;
вы не можете надежно проверить, выделено ли какое-либо место памяти. *array
не является допустимым кодом, потому что это то же самое как array[0]
, а array[0]
не выделено. Не выделенное место памяти может содержать любой значение.
единственный вариант-убедиться, что вы получаете информацию о том, выделен ли массив вместе с вашим массивом. Популярным вариантом является представление нераспределенного массива как NULL
, но вы можете выбрать и другой вариант.
By кстати, есть разница между пустым массивом (то есть массивом размером 0) и массивом, который вообще не выделяется. Первый вариант возникает при использовании malloc(0)
, второй, когда ваш указатель не инициализируется вообще. Для malloc(0)
разрешено возвращаться NULL
, но разрешено возвращать ненулевой указатель (который вы, однако, не можете разыменовать). Обе стороны действуют по стандарту.
непосредственной проблемой с вашим кодом является то, что вы разыменовываете array
перед сравнением с NULL. Тип выражение *array
и int
, а не int *
. Оставьте оператор разыменования, и типы будут соответствовать:
if (array == NULL) {...}
обратите внимание, что неинициализированный указатель гарантированно содержит NULL, только если он был объявлен со статическим экстентом (т. е. он был объявлен либо в области файла, либо с static
ключевое слово перед ним). Аналогично, вызов free
на указателе не будет установлено значение указателя NULL; он будет содержать то же значение указателя, что и раньше, но теперь будет недействительным.