使用无符号短指针存储和访问不同数据类型

Storing and accessing different data types with unsigned short pointer

我没有用指针做太多工作,所以这整件事对我来说有点新鲜 - 如果我遗漏了一些明显的东西,请原谅我。我要做的是将不同类型的变量保存到 uint16_t 指针中。 我的指针是这样的:

uint16_t* ptr = (uint16_t*) malloc(6 * sizeof(uint16_t)); .

我可以使用 char 或 float 指针,但我的目标是了解如何将不同类型的变量保存到整数指针中,然后通过操作内存读回。我保存了一个像这样的 char 变量: *(ptr) = ("X"); *(ptr + 1) = "P"; 和一个像这样的 double 变量:*(ptr + 2) = (float)M_PI; .

当我尝试将 *(ptr) 处的值打印为字符时,我确实得到了一个字符,但它不是 X(我得到的是 T)。尝试打印浮点数给我 0.00000。

我没有找到涵盖此问题的任何有用主题,如果有人可以向我解释存储和检索此信息,我将非常高兴。谢谢!

When I try to print the value at *(ptr) as a char, I do get a char, but it is not X (I get T).

你的代码有几个问题

  • *(ptr) = ("X"); *(ptr + 1) = "P";

应该写成:

 *(ptr) = 'X'; (no need for bracket)
 *(ptr + 1) = 'S'; // also for 'S'

在 C 中," 用于字符串,' 用于单个字符


  • *(ptr + 2) = (float)M_PI;

您正在尝试将 4 个字节装入一个只能包含 2 个字节的 ptr。(假设您的 OS 上有 32 位浮点数)


  • (uint16_t*) malloc(6 * sizeof(uint16_t));

Don't cast malloc (麦克猫)


通过将您的变量重新组合到一个结构中,找到实现您想要的目标的方法,而不会遇到未定义的行为或转换问题:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

typedef struct mystruct {
    float f;
    char c;
    char b;
}   t_mystruct;


void main ()
{
    t_mystruct *ptr = malloc(sizeof(t_mystruct));
    ptr->c = 'X';
    ptr->b = 'S';
    ptr->f = (float)M_PI;
    printf("%c %c %f\n", ptr->c, ptr->b, ptr->f);
}

用 gcc 编译 test.c -lm && ./a.out