32位和64位之间完全不同的输出

问题描述 投票:1回答:1

我正在聊天客户端和服务器。我目前在我的服务器中有这一行用于调试目的:

printf("Message for %s:\nTimestamp: %ld, Message: %s, Length: %d\n", args->name, *(int64_t*)(message->data), message->data+8, message->length);

args->name包含一个正常的以null结尾的字符串的char*,而message是一个结构字符串*:

struct string
{
    char* data;
    uint32_t length;
    uint32_t capacity;
};

在这种情况下,前8个字节是posix时间戳,其余的只是一个以空字符结尾的字符串。

如果我用-m64编译,我得到这个输出:

Message for some_user:
Timestamp: 1512060499, Message: >Server1@some_user:test, Length: 32

但是使用-m32进行编译会产生以下结果:

Message for some_user:
Timestamp: 1512060650, Message: (null), Length: 69823144

现在,消息通过包含此行的函数传输到客户端:

write(socket_fd, message->data, message->length)

非常奇怪的是,消息完全正确地到达客户端。我在客户端获得完全相同的输出。

我是否以某种方式使用了printf函数?

c pointers printf cpu-architecture
1个回答
2
投票

使用错误的格式说明符打印是UB(2个位置)。

// printf("Message for %s:\nTimestamp: %ld, Message: %s, Length: %d\n", 
//    args->name, *(int64_t*)(message->data), message->data+8, message->length);

#include <inttypes.h>

printf("Message for %s:\nTimestamp: %" PRId64 ", Message: %s, Length: %" PRIu32 "\n", 
    args->name, *(int64_t*)(message->data), message->data+8, message->length);

int64_t进行任意对齐指针的转换和解除引用可能会产生问题。最好复制。

int64_t t64;
memcpy(&t64, message->data, sizeof t64);
printf("Message for %s:\nTimestamp: %" PRId64 ", Message: %s, Length: %" PRIu32 "\n", 
    args->name, t64, message->data+8, message->length);
© www.soinside.com 2019 - 2024. All rights reserved.