Указатель, указывающий на пустой массив

У меня есть указатель, указывающий на начало массива, но мне нужно проверить, что он нераспределен. Я подумал о разыменовании указателя и проверке, если 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 - Это:

  1. убедится *array имеет значение NULL не выделяется. int *array = NULL;
  2. проверьте, является ли массив 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; он будет содержать то же значение указателя, что и раньше, но теперь будет недействительным.


вы должны использовать его следующим образом:

if(array == NULL) ...