Инициализация указателя в c и объяснение, что означает де-ссылку на указатель NULL [дубликат]

Мне нужно было сделать что-то подобное, и в моем случае проблема была в памяти - мне нужно было объединить несколько объектов набора данных в список, после того как они сделали что-то с ними, как новый объект, и нужно было избавиться от каждой записи. сливалось воедино, чтобы не дублировать их и не взрывать память. В моем случае наличие объектов в словаре вместо списка работало нормально:

`` `

k = range(5)
v = ['a','b','c','d','e']
d = {key:val for key,val in zip(k, v)}

print d
for i in range(5):
    print d[i]
    d.pop(i)
print d

` ``

37
задан Reddy 9 May 2014 в 10:04
поделиться

5 ответов

Указатель NULL указывает на память, которая не существует. Это может быть адрес 0x00000000 или любое другое значение, определенное реализацией (если оно никогда не может быть реальным адресом). Выражение разыменования означает попытку доступа к тому, на что указывает указатель. Оператор * является оператором разыменования:

int a, b, c; // some integers
int *pi;     // a pointer to an integer

a = 5;
pi = &a; // pi points to a
b = *pi; // b is now 5
pi = NULL;
c = *pi; // this is a NULL pointer dereference

Это то же самое, что и NullReferenceException в C #, за исключением того, что указатели в C могут указывать на любой объект данных, даже элементы внутри массив.

51
ответ дан Greg Hewgill 31 August 2018 в 15:37
поделиться

Разыменование просто означает чтение значения памяти по заданному адресу. Поэтому, когда у вас есть указатель на что-то, в разыменовать указатель означает читать или записывать данные, на которые указывает указатель.

В C унарный оператор * оператор разыменования. Если x является указателем, то *x указывает на то, что x указывает на. Унарный оператор & является адресом - . Если x - это что-то, то &x - это адрес, в котором x хранится в памяти. Операторы * и & являются инверсиями друг друга: если x - это любые данные, а y - любой указатель, то эти уравнения всегда верны:

*(&x) == x
&(*y) == y

A null Указатель - это указатель, который не указывает на какие-либо действительные данные (но это не единственный такой указатель). В стандарте C говорится, что это неопределенное поведение для разыменования нулевого указателя. Это означает, что абсолютно все может случиться: программа может потерпеть крах, она может продолжать работать молча или может стереть ваш жесткий диск (хотя это маловероятно).

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

int *x = NULL;  // x is a null pointer
int y = *x;     // CRASH: dereference x, trying to read it
*x = 0;         // CRASH: dereference x, trying to write it

И да, разыменование нулевого указателя в значительной степени похоже на NullReferenceException в C # (или NullPointerException в Java), за исключением того, что стандарт langauge здесь немного полезнее. В C # разыменование нулевой ссылки имеет четко определенное поведение: оно всегда выбрасывает NullReferenceException. Нет никакой возможности, чтобы ваша программа продолжала работать молча или стирать ваш жесткий диск, как в C (если в языке не существует ошибки, но опять же это невероятно маловероятно).

21
ответ дан Adam Rosenfield 31 August 2018 в 15:37
поделиться

Цитирование из wikipedia :

Указатель ссылается на местоположение в памяти и получает значение в месте, на которое ссылается указатель, называется разыменованием указателя.

Выделение производится с помощью оператора unary * на указателе.

int x = 5;
int * p;      // pointer declaration
p = &x;       // pointer assignment
*p = 7;       // pointer dereferencing, example 1
int y = *p;   // pointer dereferencing, example 2

«Вызов указателя NULL» означает выполнение *p, когда p NULL

0
ответ дан Arun 31 August 2018 в 15:37
поделиться

В основном это означает

myclass *p = NULL;
*p = ...;  // illegal: dereferencing NULL pointer
... = *p;  // illegal: dereferencing NULL pointer
p->meth(); // illegal: equivalent to (*p).meth(), which is dereferencing NULL pointer

myclass *p = /* some legal, non-NULL pointer */;
*p = ...;  // Ok
... = *p;  // Ok
p->meth(); // Ok, if myclass::meth() exists

, почти все, что связано с (*p) или неявно с участием (*p), например. p->..., который является сокращением для (*p). ...; кроме объявления указателя.

2
ответ дан Lie Ryan 31 August 2018 в 15:37
поделиться

Из wiki

Нулевой указатель имеет зарезервированное значение, часто, но необязательно значение 0, указывающее, что оно не ссылается на объект.

Поскольку нулевой указатель не ссылается на значимый объект, попытка разыменования нулевого указателя обычно вызывает ошибку времени выполнения.

int val =1;
int *p = NULL;
*p = val; // Whooosh!!!! 
0
ответ дан Prasoon Saurav 31 August 2018 в 15:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: