修改指针(如果在C ++中为NULL)

时间:2019-09-03 15:13:49

标签: c++

我正在尝试调试程序。如果该指针为NULL,它将设置一个指针。如您所见,我的代码识别出指针为NULL并对其进行了修改,但是printf函数的结果仍然相同,就好像它没有修改

#include <iostream>
#include <cstring>

int main()
{
    uint8_t x = 0;
    uint8_t* a = &x;
    uint8_t *b = NULL;
    printf("b: %p\n", (void*)&b);
    if (!b) {
        printf("modifying b\n");
        b = a;
    }
    printf("b: %p\n", (void*)&b);
    return 0;
}

输出为:

b: 0x7ffe77813140                                                                                                                                                          
modifying b                                                                                                                                                                
b: 0x7ffe77813140

2 个答案:

答案 0 :(得分:3)

  

但是printf函数的结果仍然相同,就好像它没有修改

printf("b: %p\n", (void*)&b);

printf不打印(指针)对象的值。 &是操作符的地址,因此它将打印存储对象的地址。更改对象的值不会更改对象的存储位置。实际上,对象永远不会改变其在内存中的位置。

您可以通过直接传递变量的值来打印它的值,而无需使用addressof运算符:

printf("b: %p\n", (void*)b);

或更简单地使用iostream:

std::cout << "b: " << (void*)b << '\n';

P.S。在这些情况下,需要转换为void*的原因是不同的。 printf之所以需要它,是因为%p特别需要一个void*,而传递任何其他内容都违反了此要求。

所有指针都可以传递给iostream,但是指向字符的指针是特殊的,并以字符串形式打印(例如%s中的printf),uint8_t通常是的别名。 unsigned char。因此,为了打印uint8_t*的值,我们需要转换为另一种指针类型。

答案 1 :(得分:1)

您正在使用

 printf("b: %p\n", (void*)&b);

这将给出b的地址。即b的存储位置。即使b的值为NULL,整个程序也将保持不变。

您应该使用

 printf("b: %p\n", (void*)b);