簡體   English   中英

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終止的普通字符串,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM