C-String的字节大小之间的差异

时间:2012-09-19 03:04:15

标签: c char byte sizeof

我一直在为我的数据网络课程开发一个项目,他们让我连接这样的标题:

struct ip
{
    unsigned long a;
    unsigned long b;
    unsigned int l;
} IP;

这是一个消息,它是一个char *让我们说“你好”。

所以,我使用这个方法将这两个连接在一个char *:

memcpy(sendBuf, (void*)&sendHeader, sizeof(sendHeader));
memcpy(&sendBuf[sizeof(sendHeader)], readMessage, lengthMessage);

lengthMessage是消息+1的字符数,它是空终止字符。

所以,sendBuf的定义如下:

char sendBuf[BUFLEN + 1]   // BUF_LEN = 128

然后我把这个char *放在这样定义的队列中:

concurrency::concurrent_queue<char*> IP_in_queue;

所以,我想检查信息是否正确,所以我只检查一切:

char* s;
IP_in_queue.try_pop(s);
numbytes = sizeof(s);
// Copy from buf to the header
memcpy( (void*)&readHeader, s, sizeof( IP_PACKET_HEADER_T));
// Copy message part
memcpy( sendedString, &s[sizeof(IP_PACKET_HEADER_T)], numbytes - sizeof(IP_PACKET_HEADER_T));
// Append \0 to the end
sendedString[numbytes - sizeof(IP_PACKET_HEADER_T)] = '\0';

所以,在我排队我的char *之前,我们知道sendBuf的大小是129,但是当我检查出队后它的字节数太多不同时,它的字节数是4的值,但即使在这样我得到的信息是正确的,所以我不明白,也许我错过了一些重要的事情,但变量numbytes不应该至少更多?

我希望我能说清楚,也许有人可以更好地解释我。

由于

1 个答案:

答案 0 :(得分:1)

sizeof没有告诉你字符串的长度 - 它告诉你类型char*的大小,在32位机器上是4字节。你想要strlen,字符串中的字节数。

但即使这不是你想要的。您的结构IP中可能包含空值,因此即使strlen也无法给出正确的答案。如果你把你的字符串放在第一位而不是最后一位你可以修复它,但我会考虑那种黑客。您应该明确地将大小添加到邮件的开头。