32 位和 64 位之间完全不同的输出
Completely different output between 32-bit and 64-bit
我正在开发聊天客户端和服务器。
我目前在我的服务器中有这一行用于调试目的:
printf("Message for %s:\nTimestamp: %ld, Message: %s, Length: %d\n", args->name, *(int64_t*)(message->data), message->data+8, message->length);
args->name
包含一个 char*
到一个正常的以 null 结尾的字符串,消息是一个结构字符串 *:
struct string
{
char* data;
uint32_t length;
uint32_t capacity;
};
在这种情况下,前 8 个字节是 posix 时间戳,其余只是一个以 null 结尾的字符串。
如果我用 -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 函数?
使用错误的格式说明符打印 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);
我正在开发聊天客户端和服务器。 我目前在我的服务器中有这一行用于调试目的:
printf("Message for %s:\nTimestamp: %ld, Message: %s, Length: %d\n", args->name, *(int64_t*)(message->data), message->data+8, message->length);
args->name
包含一个 char*
到一个正常的以 null 结尾的字符串,消息是一个结构字符串 *:
struct string
{
char* data;
uint32_t length;
uint32_t capacity;
};
在这种情况下,前 8 个字节是 posix 时间戳,其余只是一个以 null 结尾的字符串。
如果我用 -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 函数?
使用错误的格式说明符打印 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);