[英]Printing the address of a struct object
我有这样的struct
typedef struct _somestruct {
int a;
int b;
}SOMESTRUCT,*LPSOMESTRUCT;
我正在为struct
创建一个对象,并试图像这样打印它的地址
int main()
{
LPSOMESTRUCT val = (LPSOMESTRUCT)malloc(sizeof(SOMESTRUCT));
printf("0%x\n", val);
return 0;
}
..我得到了这个警告
警告C4313:'printf':格式字符串中的'%x'与'LPSOMESTRUCT'类型的参数1冲突
所以,我试着像这样把地址转换为int
printf("0%x\n", static_cast<int>(val));
但我得到这个错误:
错误C2440:'static_cast':无法从'LPSOMESTRUCT'转换为'int'
我在这里错过了什么? 如何避免这种警告?
谢谢。
%x
期望无符号。 你打印的是一个指针。 要正确执行此操作,通常需要使用%p
。 为了迂腐正确,这需要一个指向void的指针,所以你需要将它转换为:
printf("%p\n", (void *)val);
实际上,大多数当前实现对所有指针使用相同的格式,在这种情况下,转换将是空的。 当然,考虑到C ++标签,你所包含的大多数代码都充其量是有问题的(除了像LPSOMESTRUCT之类的部分,无论如何都是有问题的)。 在C ++中,您通常需要更多类似的东西:
struct somestruct {
int a;
int b;
};
somestruct *val = new somestruct; // even this is questionable.
std::cout << val;
使用%p格式说明符打印指针。
printf("%p\n", val);
如果你想使用reinterpret_cast而不是static_cast进行强制转换,可以在这里诀窍。
使用printf尝试使用%zu而不是%x来打印指针,因为指针是无符号整数类型(即%zu)。
printf("%zu \n", val);
另外一件事,作为一个c ++程序,你有没有理由使用malloc而不是new?
由于这是标记的C ++,我可以指出在使用该语言创建结构时不需要typedef:
typedef struct _somestruct {
int a;
int b;
}SOMESTRUCT,*LPSOMESTRUCT;
应该:
struct SOMESTRUCT {
int a;
int b;
};
此外,许多人认为创建像LPSOMESTRUCT这样的typedef是一种不好的做法,它隐藏了一个类型是指针的事实。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.