我想将不同的数据类型存储在同一分配的内存中,以便通过仅分配一次内存来减少执行时间。我发现实际上可以创建一个数组uint8_t
变量并创建一个新的uint16_t
指向相同内存地址的指针,然后我可以以两种方式读取值。
这允许我创建一个指针,比如说指向分配的内存的中间,并将后半部分的值存储在不同的数据类型中。
这样做可以吗?我知道我需要注意内存边界,但是这种风格很糟糕吗?
这是我的代码:
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdlib.h>
int main(void){
uint8_t *array;
uint16_t *array2;
array = calloc(6, 1);
array[0] = 257;
printf("array[0]= %" PRIu8 "\n", array[0]);
printf("array[1]= %" PRIu8 "\n", array[1]);
printf("Adresse von array[0] = %p\n", &array[0]);
array2 = &array[0];
printf("Adresse auf die array2 zeigt = %p\n", array2);
array2[0] = 257;
printf("array2[0]= %" PRIu16 "\n", array2[0]);
printf("array2[1]= %" PRIu16 "\n", array2[1]);
printf("array[0]= %" PRIu8 "\n", array[0]);
printf("array[1]= %" PRIu8 "\n", array[1]);
getchar();
return 0;
}
Use a union
创建一个有时存储一种类型,有时存储另一种类型的变量。
union {
uint8_t u8;
uint16_t u16;
} *array_u;
size_t nmemb = 6;
array_u = calloc(nmemb, sizeof *array_u);
assert(array_u);
printf("array_u[0].u8 = %" PRIu8 "\n", array_u[0].u8);
array_u[0].u16 = 1234;
printf("array_u[0].u16 = %" PRIu16 "\n", array_u[0].u16);
...
这并没有使用所有的空间,只有一个uint8_t u8
每个工会。下面使用2uint8_t
.
union {
uint8_t u8[2];
uint16_t u16;
} *array_u;
printf("array_u[0].u8[0] = %" PRIu8 "\n", array_u[0].u8[0]);
array_u[0].u16 = 1234;
printf("array_u[0].u16 = %" PRIu16 "\n", array_u[0].u16);
OTOH 如果代码需要覆盖整个固定长度数组
union {
uint8_t u8[12];
uint16_t u16[6];
} *array_u;
array_u = calloc(1, sizeof *array_u);
assert(array_u);
printf("array_u->u8[0] = %" PRIu8 "\n", array_u->u8[0]);
array_u->u16[0] = 1234;
printf("array_u->u16[0] = %" PRIu16 "\n", array_u->u16[0]);
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)