我正在尝试调试程序。如果该指针为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
答案 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);