打印结构对象的地址

时间:2010-06-14 06:56:28

标签: c++ casting struct compiler-errors compiler-warnings

我有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'in   格式字符串与参数冲突   1'类型'LPSOMESTRUCT'

所以,我试图将地址转换为int,就像这样

printf("0%x\n", static_cast<int>(val));

但是我收到了这个错误:

  

错误C2440:'static_cast':不能   从'LPSOMESTRUCT'转换为'int'

我在这里缺少什么?如何避免这种警告?

感谢。

4 个答案:

答案 0 :(得分:11)

%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;

答案 1 :(得分:2)

使用%p格式说明符打印指针。

printf("%p\n", val);

答案 2 :(得分:1)

如果你想使用reinterpret_cast而不是static_cast进行强制转换,可以在这里诀窍。

使用printf尝试使用%zu而不是%x来打印指针,因为指针是无符号整数类型(即%zu)。

printf("%zu \n", val);

另外一件事,作为一个c ++程序,你有没有理由使用malloc而不是new?

答案 3 :(得分:1)

由于这是标记的C ++,我可以指出在使用该语言创建结构时不需要typedef:

typedef struct _somestruct {
    int a;
    int b;
}SOMESTRUCT,*LPSOMESTRUCT;

应该是:

struct SOMESTRUCT {
    int a;
    int b;
};

此外,许多人认为创建类型定义如LPSOMESTRUCT是一种不好的做法,它隐藏了类型是指针的事实。