我正在C中完成作业并在追踪错误时,我遇到了一些我作为初学者不明白的事情。
我正在做的是将一些变量记忆到函数l1_connect()
中的缓冲区:
int l1_connect(const char* hostname, int port) {
// Variables to be stored in the buffer
char *msg = "Hi, I'm a message"; // strlen(msg) == 17
uint16_t sender_id = htons(1); // sizeof(sender_id) == 2
uint16_t packet_size = htons(sizeof(packet_size)+sizeof(sender_id)+strlen(msg)); // sizeof(packet_size) == 2
// The buffer
char buf[100];
// Copying everything
memcpy(&buf, &sender_id, sizeof(sender_id));
memcpy(&buf+sizeof(sender_id), &packet_size, sizeof(packet_size));
memcpy(&buf+sizeof(sender_id)+sizeof(packet_size), &msg, strlen(msg));
printf("l1_connect - sizeof(buf): %d\n", (int)sizeof(buf)); // == 21
// Passing buf to another function
int bytes_sent = l1_send(1, buf, sizeof(buf));
return bytes_sent;
}
在这个函数的最后,缓冲区的大小是21.然而,在将它传递给另一个函数之后,它显然是8。
int l1_send( int device, const char* buf, int length ) {
printf("l1_send - Sizeof buf: %d\n", (int)sizeof(buf)); // == 8
printf("l1_send - Sizeof &buf: %d\n", (int)sizeof(&buf)); // == 8
printf("l1_send - Sizeof *buf: %d\n", (int)sizeof(*buf)); // == 1
printf("l1_send - Sizeof &buf[0]: %d\n", (int)sizeof(&buf[0])); // == 8
return 1; // For now
}
任何人都可以向我解释我错过了什么吗?
我试图通过UDP套接字发送缓冲区,然后再次提取这三个变量。提取sender_id
和packet_size
的工作正常,但是消息会一直给出错误或空值,并且由于缓冲区大小问题,我假设它是错误的。
谢谢!
编辑:非常感谢,伙计们!我已经意识到为什么我们将length
传递给l1_send()
答案 0 :(得分:2)
sizeof
是一个返回变量类型大小的运算符,而不是分配缓冲区的大小。
所以,看似64位机器:
// l1_send
sizeof(buf) --> size of char * --> 8 bytes
sizeof(&buf) --> size of char ** --> 8 bytes
sizeof(*buf) --> size of char --> 1 byte
sizeof(&buf[0]) --> size of char * --> 8 bytes
// l1_connect
sizeof(buf) --> size of char[100] --> 100 bytes (that's what it should be)
答案 1 :(得分:1)
要获得数组的大小,您应该使用以下代码段:
int buff[100];
int buff_size = sizeof(buff) / sizeof(buff[0]);
除此之外,做一个sizeof
指针,你肯定会得到4
或8
字节,具体取决于架构。
因此,当您从数组转换为指针时,会出现某种信息丢失。
答案 2 :(得分:0)
// The buffer
char buf[100];
const char * buff_size = buf;
sizeof(buf); // This is valid
sizeof(buff_size);
后来编译器也不知道它指向的位置。由于sizeof()
在编译时工作,sizeof(buff_size)
将返回8个字节