可以将不同的数据类型存储在C中相同的已分配内存中吗?

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)

  • @TimFinnegan`array_u-> u16 [0]`和`array_u [0] .u16 [0]`之间没有功能差异.使用最能传达代码含义的表单. (2认同)