Проблема с двумя указателями, указывающими на одно и то же место - PullRequest
0 голосов
/ 06 апреля 2020

У меня проблема с указателями, которые я не знаю, как решить. Мой указатель p указывает на определенный адрес в памяти. Я хочу указать указатель q на точно такой же адрес. После этого я хочу указать указатель p на NULL. Проблема в том, что после этого указатель q также указывает на NULL, но я хочу, чтобы он продолжал указывать на начальный адрес. Есть ли способ сделать это? Вот простой код того, что я хочу сделать:

    int* p = &a; //pointer "p" now points to "a"
    int* q;
    q = p; //pointer "q" points to "a" as well
    *p = NULL; //pointer "p" points to NULL
    printf("%d", *q); //pointer "q" points to NULL as well, but I want him to keep pointing to "a"

Ответы [ 5 ]

1 голос
/ 06 апреля 2020

В вашем коде p и q указывают на одно и то же место в памяти. Вы не изменили указатель на другое местоположение, но переписали значение, указанное p (которое также указано q), в NULL.

Это должно работать.

    int a = 5;
    int* p = &a; //pointer "p" now points to "a"
    int* q = &a;
    p = q;
    p = NULL; //pointer "p" points to NULL
    printf("%d", *q);
0 голосов
/ 06 апреля 2020

*p = NULL; //pointer "p" points to NULL

Нет, это не так. Вы разыменовываете этот указатель и устанавливаете a в NULL, преобразованное в int (который обычно равен нулю)

Если вы хотите установить p в NULL, вам нужно p = NULL;

Если ваша идея заключалась в том, чтобы p ссылался на указатель q, вам нужно изменить код на:

int a = 5;
int* q = &a;
int **p; 
p = &q;
*p = NULL; //now *p && q are NULL
0 голосов
/ 06 апреля 2020

Проблема в вашем коде:

*p = NULL;

Таким образом, вы разыменовываете p и записываете значение NULL в a, что неправильно в вашем случае. NULL предназначен для присвоения или сравнения с указателями , а не с объектом, на который указывает указатель (если только объект ссылки, здесь a, также не будет указателем - ( указатель на указатель )).

Решение:

Необходимо опустить оператор разыменования (*):

p = NULL;

для присвойте NULL p, а не a.


Исправленный код ( Пример в сети ):

#include <stdio.h>
int main (void)  
{
    int a = 5;
    int* p = &a; //pointer "p" now points to "a"
    int* q;

    q = p;       //pointer "q" points to "a" as well
    p = NULL;    //pointer "p" points to NULL

    printf("*q = %d\n", *q);
    printf("p = %p", (void*)p);
}

Выход:

*q = 5
p = (nil)
0 голосов
/ 06 апреля 2020

Проблема здесь: *p = NULL; //pointer "p" points to NULL
Вы не сбрасываете, куда указывает указатель, вы устанавливаете значение в указанном местоположении.

Просто пример:

*ptr = value // (writes the value to the memory location of ptr)
ptr = value // (changes the referenced memory location to value)
0 голосов
/ 06 апреля 2020

*p = NULL; //pointer "p" points to NULL это неправильно, вы разыменовываете p и устанавливаете в NULL значение, на которое оно ссылается.

Используйте p = NULL.

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