Когда вы имеете дело с C и другими языками, которые имеют указатели, инициализация указателя автоматически устанавливает его в нуль? - PullRequest
0 голосов
/ 16 октября 2011

Допустим, вы определили переменную (глобальную или локальную) указателя, такую ​​как эта:

    void *this_is_a_pointer;

, не задавая ей значение "= NULL;"

Это автоматически даст вамNULL ptr (указатель, который указывает на NULL)?

* Кроме того, что означает, что нулевой указатель указывает на NULL?Это говорит о том, что оно может указывать буквально где-нибудь ?(в принципе, что на самом деле означает «адресное местоположение NULL »?)

Ответы [ 4 ]

7 голосов
/ 16 октября 2011

(глобальный или локальный)

В этом-то и заключается разница.

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

// foo.cpp

void* this_is_null;

void whatever(void)
{
    static int* and_so_is_this;
}

void not_whatever(void)
{
    float* but_this_local_is_uninitialized;
}
3 голосов
/ 16 октября 2011

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

EDIT: В ответ на ваши изменения значение NULL определяется как ноль.Таким образом, он будет указывать на адрес 0, который в большинстве современных операционных систем приведет к ошибке сегментации или нарушению доступа к памяти.Но в некоторых встроенных операционных системах с небольшим управлением памятью это позволит вам изменить содержимое адреса 0!Этот укусил меня несколько раз;)

1 голос
/ 16 октября 2011

Указатель с статической продолжительностью хранения будет автоматически инициализирован значением NULL.Указатель с автоматической продолжительностью не будет инициализирован и будет содержать случайное значение, которое может соответствовать или не соответствовать действительному адресу памяти:

#include <stdio.h>

int *p0; // File scope, initialized to NULL

int main(void)
{
  static int *p1; // Declared "static", initialized to NULL
  int *p2;        // Auto, not initialized

  printf("p0 = %p, p1 = %p, p2 = %p\n", (void *) p0, (void *) p1, (void *) p2);
  return 0;
}

Существует нулевой указатель константа ,который равен 0 (макрос NULL раскрывается в 0-значное выражение указателя).Существует нулевой указатель значение , который может быть или не быть 0-значным;это значение, используемое базовой системой для обозначения четко определенного «нигде».Когда в вашем коде появится нулевой указатель constant , он будет заменен нулевым указателем value .

Значение нулевого указателя гарантированно сравнивается с любым допустимым значением указателя.

1 голос
/ 16 октября 2011

C Tutorial - Подробнее об указателях

Инициализировать указатель

Прежде чем вы сможете использовать указатель, например, для оператора printf, вы должны инициализировать указатель. Следующий пример не будет инициализировать указатель:

#include<stdio.h> 

void main()

{

    int *ptr_p;

    printf("%d\n",*ptr_p);

}

Примечание: мы использовали void, когда объявили функцию main (). Так что нет возврата 0; нужно. (Некоторые компиляторы выдают предупреждение при использовании void на главный(). Компилятор GNU выдаст предупреждение: тип возвращаемого значения 'main' is не "int").

В этом примере мы печатаем значение, на которое указывает ptr_p. Однако мы не инициализировал указатель. В этом случае указатель содержит случайный адрес или 0.

Результатом этой программы является ошибка сегментации, некоторые другие ошибка во время выполнения или случайный адрес печатается. Значение Ошибка сегментации в том, что вы использовали указатель, который указывает на неверный адрес.

10,4 Нулевые указатели

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

# включая

int * ip = NULL; <и проверить его на нулевой указатель перед проверкой указанное вами значение может использовать код вроде </p>

          if(ip != NULL)
  printf("%d\n", *ip); 

Также можно ссылаться на нуль указатель с помощью константы 0, и вы увидите некоторый код, который устанавливает нулевые указатели, просто делая

int * ip = 0;

(На самом деле, NULL - это макрос препроцессора, который обычно имеет значение или текст замены 0.) Кроме того, так как определение `` true '' в C является значением, которое не равно 0, вы увидит код, который проверяет ненулевые указатели с сокращенным кодом как

if (ip) printf ("% d \ n", * ip);

Это имеет то же значение, что и наш предыдущий пример; if (ip) эквивалентно if (ip! = 0) и if (ip! = НОЛЬ). Все эти виды использования являются законными, и хотя я рекомендую вам используйте константу NULL для ясности, вы встретите другой формы, чтобы вы могли их распознать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...