0
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

char* createMSG(uint8_t i,uint32_t port);

int strlen(char* tmp);
uint32_t user_port = 5000;

int main(int argc, char** argv) {
    char *msg;
    uint8_t i;
    i = 1;  
    msg = createMSG(i,user_port);
    printf("Port: %d",*(msg+2));
}

char* createMSG(uint8_t i,uint32_t port) {
    char *buff; 
    buff = (char*) malloc(6);
    uint8_t id;
    id = 2;
    memcpy(buff, &id, sizeof(uint8_t));
    memcpy(buff+1, &i, sizeof(uint8_t));
    memcpy(buff+2, &port, sizeof(uint32_t));
    return buff;
}

出力は「ポート: -120」です。若干のオーバーフローがあるようです。しかし、uint32_t は 5000 に対して十分な大きさである必要があります。5000 の代わりに 22 を使用すると、すべて問題ありません。

なんで?

4

2 に答える 2

4

*(msg+2)型があるからcharです。本当にやりたいならやればいい

printf("Port: %d",*(uint32_t*)(msg+2));

@R..で指摘されているように、msg+2 はほぼ確実に uint32_t 型の適切なアラインメント要件を満たしていません。コードが機能しているように見える場合、それは事故であり、移植性がありません。

于 2012-05-18T20:36:28.103 に答える
2

この行

printf("Port: %d",*(msg+2));

uint32_t ではなく、(msg+2) アドレスに 'char' 値を出力します。

使用する

uint32_t PortFromProc = *(uint32_t*)(msg+2);
printf("Port: %d", PortFromProc);

recvfrom() 関数からポート番号を「修正」するには、ntohl() 関数を使用する必要があります。

于 2012-05-18T20:36:55.983 に答える