如何存储数据类型大于数组的数据?

时间:2019-12-02 00:50:17

标签: c pointers

假设我有一个存储8位整数的数组。如何从输入中读取32位整数并将其存储在数组的4个连续位置中?例如...

uint8_t * myArray = malloc(1024 * sizeof(uint8_t) ); 
scanf("%x", &myArray[0]);

for (int i = 0; i < 4; i++)
    printf("0x%02x\n"); // %02x prints an integer in HexaDecimal format with 2 0's padding to the left 
INPUT: 
0xAABBCCDD

OUTPUT: 
0xDD
0xCC
0xBB
0xAA

明白吗?我希望不要将数据的最高有效位分散到以下位置。我怎样才能做到这一点?我知道它与指针算术有关,但我只是不知道是什么。

1 个答案:

答案 0 :(得分:3)

您所拥有的代码现在只要修复printf语句即可在C中按您希望的方式实际运行:

从此:

printf("0x%02x\n");

对此:

printf("0x%02x\n", myArray[i]);

我认为您可以使用%x作为格式说明符(它是无符号int)来怀疑您的scanf语句,但是&myArray[0]是字节指针。读入字节地址的4字节将溢出到接下来的3个字节中,这是分配的数组的一部分。

我可能将其编码如下:

uint32_t * myArray = malloc(256 * sizeof(uint32_t)); 
uint8_t* myByteArray = (uint8_t*)myArray;
scanf("%x", &myArray[0]);

for (int i = 0; i < 4; i++)
    printf("0x%02x\n", myByteArray[i]);

如果您想成为纯粹主义者而不是依靠指针黑客。假设您所暗示的是一点尾数语义:

uint32_t* myArray = malloc(256 * sizeof(uint32_t)); 
scanf("%x", &myArray[0]);

for (int i = 0; i < 4; i++)
{
     uint32_t val = ((myArray[i/4] >> (i*8)) & 0x000000ff;
     printf("0x%02x\n", (unsigned int)(val));
}