C,创建指向8位数组的32位指针

gis*_*gur 4 c arrays pointers

我有一个缓冲区,缓冲区中的每个条目的大小为8位:

uint8_t Buffer[10] = {0x12,0x34,0x56,0x78,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6};
Run Code Online (Sandbox Code Playgroud)

我需要做的是创建指向该数组的指针,例如16位和32位指针。例如:

uint32_t *x;
x = Buffer;

uint32_t *y;
y = Buffer+4;

uint16_t *z;
z = Buffer+8;
Run Code Online (Sandbox Code Playgroud)

然后每个变量将从数组中读取的位置,例如:

x = 0x78563412
y = 0xf4f3f2f1
z = 0xf6f5
Run Code Online (Sandbox Code Playgroud)

这完全可以正常工作,问题是我收到有关不兼容的指针类型的警告。所以我想知道是否还有其他方法可以做到,还是我只能忍受警告呢?还是我只是完全以错误的方式进行此操作?

请注意,此代码将在字节序始终相同且数据类型大小始终相同的单一平台上执行。

Cor*_*lks 6

您应该注意警告。您正在做的是未定义的行为。像这样的类型别名是未定义的行为,特别是因为不能保证Buffer具有正确的对齐方式,因此可以将其作为int/ 进行访问short。如果Buffer具有正确的对齐方式,则可以显式进行强制转换(警告将消失)。

您有两种选择:

一种,将缓冲区与两种类型中的较大者对齐。请注意,您的指针算法不会引发对齐问题:

#include <stdalign.h>

alignas(int) unsigned char Buffer[10] = {0x12,0x34,0x56,0x78,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6};

unsigned int *x;
x = (unsigned int*)(Buffer);

unsigned int *y;
y = (unsigned int*)(Buffer+4);

unsigned short *z;
z = (unsigned short*)(Buffer+8);
Run Code Online (Sandbox Code Playgroud)

二,创建一个unsigned int/ unsigned short变量,然后memcpy将您感兴趣的字节放入变量中:

unsigned int x;
memcpy(&x, Buffer, 4);

unsigned int y;
memcpy(&y, Buffer + 4, 4);

unsigned short z;
memcpy(&z, Buffer + 8, 2);
Run Code Online (Sandbox Code Playgroud)

  • C中没有`reinterpret_cast`。 (2认同)