我可以更改先前在 C 中声明的变量的数据类型吗?

Can I change the datatype of previously declared variable in C?

我已经声明了一个字符串并使用 malloc 函数分配了内存...现在我想将此字符串更改为浮动类型。

char *str;
str=malloc(sizeof(char)*10);
strcpy(str,"123.4");
float i=strtof(str, NULL);

现在我不想使用新变量 'i',而是想将它存储在 str 本身中。我需要从 'str'
访问数据 1.可以吗??
2.如果没有建议更好的解决方案或间接方法。
请清楚回答第一个问题。

您可以使用 union

union mytype {
  char * str;
  float f;
};

由于 malloc() 返回的指针对齐得很好,可以用作指向任何类型的指针,您可以(但可能不应该)使用:

assert(sizeof(float) <= 10);
void *data = malloc(10);
char *str = data;
strcpy(str, "123.4");
float *vp = data;
*vp = strtof(str, NULL);

…use *vp…

free(data);

现在您可以使用 *vp 作为 float 值。然而,与以下相比,这太荒谬了:

char *str = malloc(10);
strcpy(str, "123.4");
float value = strtof(str, NULL);

…use value…

free(str);

这基本上是您的原始代码 — 您出于不明确的原因决定这不是您想做的。

有办法做到这一点,但它丑陋、不安全,可能无法按预期工作,绝对推荐。

您可以将 str 指向的内存的前 sizeof (double) 字节视为 double1:

*(double *)str = strtod( str, NULL );

基本上,我们将 str 视为 double 对象的地址,并将 strtod 的结果分配给它。要访问该 double 值,您需要再次转换:

printf( "value stored in str = %f\n", *(double *) str );

现在,这意味着我们已经用 double 值覆盖了字符串的前 sizeof (double) 个字节,因此您丢失了原始字符串值。如果您需要在保留原始字符串值的同时将其视为浮点值,那么您 必须 使用单独的对象来执行此操作。 C 不是 Python 或 Javascript,并且值不会根据上下文神奇地改变它们的表示。


  1. 除非您真的受限于内存或有特定原因要使用 float,否则请改用 double。这也意味着您需要确保分配的内存至少 sizeof (double) 字节宽。