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

时间:2014-02-17 20:45:38

标签: c

我正在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_idpacket_size的工作正常,但是消息会一直给出错误或空值,并且由于缓冲区大小问题,我假设它是错误的。

谢谢!

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

3 个答案:

答案 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指针,你肯定会得到48字节,具体取决于架构。 因此,当您从数组转换为指针时,会出现某种信息丢失

答案 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个字节