我正在尝试使用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';
};
它运作得很好。为什么它不能用于我的原始结构?
答案 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;
}