无法在c ++中将结构指针强制转换为char指针

时间:2014-11-24 19:52:16

标签: c++ pointers struct

我正在尝试使用char*转换结构指针作为函数的输入,但无法打印结构的内容。这是我的标题,必须添加到我的消息中。

struct ethernet_header
{
    int hlp;
    char info_lenght[20];
    int data_length;

};

在我的主要功能中,我正在做这个

ethernet_header *eth = new ethernet_header;
    eth->hlp = 4;
    eth->data_length = 10;
m->msgAddHdr((char *)eth,sizeof(ethernet_header));

我正在尝试以下列方式打印结构内容。

cout<<(char *)eth<<endl;

即使我尝试打印

cout<<(char *)eth->hlp<<endl;

这是一个错误。

函数msgAddHdr将结构与消息相连。当我尝试打印带有标题连接的消息时,它显示为空白,我甚至无法通过将其转换为char*来打印结构。

当我尝试使用这样的结构时:

struct test1
{

    char k = 'r';
};

它运作得很好。为什么它不能用于我的原始结构?

1 个答案:

答案 0 :(得分:1)

根据您的描述(使用char),您尝试将其打印为字符串printf("%s")

如果eth->hlp在x86计算机上的值为0x12000000(301989888),则它将作为0x00000012存储在内存中。 C / C ++中的字符串以空值终止。

while(*ptr != '\0'){
    putc(*ptr);
    ++ptr;
}

由于你的第一个字节是\0,它会在第一个字符之前终止。

我会使用循环:

for(int i = 0; i < size; ++i){
    printf("%02x", *ptr);
    ++ptr;
}

char*打印为十六进制数组。

或者如果你想打印可打印的字符(让我们假设ASCII和字符在0x20和0x7F之间)并用点.替换不可打印的字符,你可以这样做:

for(int i = 0; i < size; ++i){
    if(*ptr < 0x20 || *ptr > 0x7e){
        putc('.');
    } else {
        putc(*ptr);
    }
    ++ptr;
}