[英]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終止的普通字符串,並且message是一個結構字符串*:
struct string
{
char* data;
uint32_t length;
uint32_t capacity;
};
在這種情況下,前8個字節是posix時間戳,其余的只是一個以空值結尾的字符串。
如果使用-m64
編譯, -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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.