#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.当使用22而不是5000时,一切都很好。
为什么?
答案 0 :(得分:4)
因为*(msg+2)
的类型为char
。如果你真的想这样做,你应该做
printf("Port: %d",*(uint32_t*)(msg+2));
如 @R .. 所述,msg + 2几乎肯定不符合uint32_t类型的正确对齐要求。如果代码看似有效,那就是意外而且不可移植。
答案 1 :(得分:2)
这一行
printf("Port: %d",*(msg+2));
在(msg + 2)地址打印'char'值,而不是uint32_t!
使用
uint32_t PortFromProc = *(uint32_t*)(msg+2);
printf("Port: %d", PortFromProc);
要从recvfrom()函数“修复”端口号,必须使用ntohl()函数。