Стандартная идиома для прогулки по списку в C - PullRequest
1 голос
/ 28 мая 2011

Я читаю «Практика программирования», и в нем говорится, что стандартный цикл для прогулки по списку в C:

for (p=list;p != NULL;p=p->next)
...

Мой вопрос: как работает NULL?Я сам использовал это в программах, но никогда не задумывался над тем, как это работает.

Полагаю, NULL должен быть стандартным макросом, определенным в самом простом заголовочном файле, таком как stdio.h, но как он определяется как?Это так?

#define MACRO 0  

вот как работает 0, когда мы сравниваем указатель с 0. Этот 0 может быть действительным адресом памяти 0, тогда как мы можем отличить, чтобы сказать, что мы на самом деле имеем в виду неверный адрес, то естьуказатель имеет логическое пустое значение?

Спасибо,

Ответы [ 2 ]

4 голосов
/ 28 мая 2011

В FAQ C есть целый раздел NULL-указатели . Краткое резюме:

  • константа int значение ноль (0) в контексте, где компилятор знает, что указатель необходимо, рассматривается как «нулевой указатель»: значение указателя, как известно, не указывает на действительный адрес памяти
  • это относится только к константам, а не к любым целочисленным значениям; например, присвоение нуля переменная, а затем использование этого в качестве указателя, не гарантирует, что значение будет нулевой указатель
  • реальный адрес может быть или не быть нулевым; компилятор может перевести его на другой адрес
  • несколько заголовков стандартной библиотеки определяют макрос NULL, как простой 0 или приведение к указателю: ((void *) 0) (стандарт C допускает либо)
1 голос
/ 28 мая 2011

Это определяется как 0, да.Дело в том, что 0 - это , а не действительный адрес памяти;компьютеры фактически собраны вместе так, что попытка получить доступ к этому адресу является ошибкой.

Попробуйте запустить эту программу на своем компьютере, если вы хотите настаивать на том, что 0 является допустимым адресом:

#import <stdio.h>

int main() {
  int *p = 0;
  printf("No read error: %d\n", *p);
  *p = 1;
  printf("No write error either\n");
}
...