两个指针指向同一位置的问题

时间:2020-04-06 09:26:33

标签: c pointers null dereference

我的指针有问题,我不知道该如何解决。我的指针 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 个答案:

答案 0 :(得分:1)

在您的代码中,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);

答案 1 :(得分:0)

*p = NULL; //pointer "p" points to NULL是错误的,您取消引用p并将其引用的值设置为NULL

使用p = NULL

答案 2 :(得分:0)

问题出在这里:*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)

答案 3 :(得分:0)

您的代码中的问题是:

*p = NULL;

通过这种方式,您取消引用p并将NULL的值写入a,这在您的情况下是错误的。 NULL是要分配给指针或与指针进行比较,而不是指针所指向的对象(除非所引用的对象在这里a也是指针-( pointer to pointer ))。

解决方案:

您需要省略解引用运算符(*):

p = NULL;

NULL分配给p,而不分配给a


正确的代码(Online Example):

#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)

答案 4 :(得分:0)

*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
相关问题