Tim*_*gan 10 c memory memory-management
我想在同一个分配的内存中存储不同的数据类型,以便通过仅分配一次内存来减少执行时间.我发现实际上可以创建一个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;
}
Run Code Online (Sandbox Code Playgroud)
chu*_*ica 10
使用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);
...
Run Code Online (Sandbox Code Playgroud)
这不会使用uint8_t u8每个联合只有一个的所有空间.以下使用2 uint8_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);
Run Code Online (Sandbox Code Playgroud)
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]);
...
Run Code Online (Sandbox Code Playgroud)