所以我想做一个自定义内存分配器,你基本上输入一定大小的字节,它创建了一个N字节的巨大竞技场。一切都工作正常,除了我需要输入一个int并将其显示为十六进制的4个字节。例如:
如果我有:
unsigned char* char_pointer = (unsigned char*)malloc(4*sizeof(uint8_t));
int value = 500;
for(int i =0 ; i<8;i++){
printf("%02X ", *(char_pointer+i))
}
所以这将显示
00 00 00 00
到目前为止一切顺利。 但是,如果我想这样做,例如:
*char_pointer = value;
将显示
F4 00 00 00
我真正想要展示的是:
F4 01 00 00
对于int的值是500,它是1F4(十六进制)。我该怎么做呢?
答案 0 :(得分:1)
在此声明中:*char_pointer = value;
左值和右值的类型不匹配。 unsigned char
可以保持255
。
编译器将在此处执行implicit typecasting。
因此,只有一个字节将被复制到char pointer
指向的内存区域。
我正在展示一种脏的不可移植的方式来执行你想要的东西:
*((unsigned int*)char_pointer) = value
答案 1 :(得分:1)
它被转换为char。尝试
*(int*)char_pointer = value;
您可以选择明确地写字节:
*(char_pointer+0) = *(((char*)(&value))+0)
*(char_pointer+1) = *(((char*)(&value))+1)
*(char_pointer+2) = *(((char*)(&value))+2)
*(char_pointer+3) = *(((char*)(&value))+3)
答案 2 :(得分:1)
使用memcpy()
并让优秀的编译器对其进行优化。
unsigned char* char_pointer = malloc(sizeof value);
memcpy(char_pointer, &value, sizeof value);
答案 3 :(得分:0)
如果*char_pointer = value;
大于255,则无法使用value
。
您必须提出一种算法来分配指针。
e.g。
tempvalue = value;
for (i=0; i<4; i++)
{
char_pointer[i] = (char) tempvalue;
tempvalue /= 256;
}