gpt4 book ai didi

C - 缓冲区大小在传递给另一个函数后减小

转载 作者:太空宇宙 更新时间:2023-11-04 07:20:40 25 4
gpt4 key购买 nike

我正在用 C 语言做作业,在跟踪错误时,我遇到了一些我作为初学者不理解的东西。

我正在做的是将一些变量 memcpy 到函数 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_idpacket_size 工作正常,但消息不断给出错误或空值,我假设这是因为缓冲区大小问题。

谢谢!

编辑:伙计们,非常感谢!我开始意识到为什么我们要将 length 传递给 l1_send()

最佳答案

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)

关于C - 缓冲区大小在传递给另一个函数后减小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21838942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com