#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 все в порядке.переполнение при использовании uint32_t
Почему?
Также '% d' не является правильным форматом для' uint32_t'. Сначала это будет формат значащего значения, а не без знака. Тогда вы обычно не знаете, соответствует ли 'unsigned' 32-разрядному типу. Правильный макрос для формата - 'PRIu32' что-то вроде' 'Port:%" PRIu32 "\ n" '(да это уродливо). Также не забывайте '\ n' в конце' printf', чтобы убедиться, что вы видите результат. –
Привет, я никогда не слышал о PRIu32. С этого момента я буду PRIu32, чтобы предотвратить неожиданное поведение. До настоящего времени% d всегда выполнял свою работу. При отправке msg с sendto() я снова получаю неправильное значение для * (msg + 2), даже если я использую '(uint32_t *)'. – user1324258