2014-11-24 53 views
-3

我试图将结构指针与char*一起作为函数的输入,但无法打印结构的内容。这是我的标题,必须添加到我的消息。无法将结构指针转换为C++中的字符指针

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'; 
}; 

得很完美。为什么它不适合我的原始结构?

+0

'的sizeof(测试1)'?你可能是指'sizeof(ethernet_header)'...... – didierc 2014-11-24 19:57:13

+0

你打印结构的内容是什么意思?你能用代码向我们展示你在“打印内容”中做什么? – PaulMcKenzie 2014-11-24 19:58:53

+0

你只是不能通过将它们转换为char *来魔法打印结构。 C++不能以这种方式工作。如果你想看到一个结构,你需要逐场打印。 – 2014-11-24 21:47:18

回答

1

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

如果在x86机器上eth->hlp的值将为0x12000000(301989888),它将作为0x00000012存储在内存中。 C/C++中的字符串以null结尾。

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; 
} 
+1

在C++中,可以使用'cout << hex << setw(2)<< setfill('0')<< * ptr'。 – 2014-11-24 21:46:51