我可以更改先前在 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)
字节视为 double
1:
*(double *)str = strtod( str, NULL );
基本上,我们将 str
视为 double
对象的地址,并将 strtod
的结果分配给它。要访问该 double
值,您需要再次转换:
printf( "value stored in str = %f\n", *(double *) str );
现在,这意味着我们已经用 double
值覆盖了字符串的前 sizeof (double)
个字节,因此您丢失了原始字符串值。如果您需要在保留原始字符串值的同时将其视为浮点值,那么您 必须 使用单独的对象来执行此操作。 C 不是 Python 或 Javascript,并且值不会根据上下文神奇地改变它们的表示。
- 除非您真的受限于内存或有特定原因要使用
float
,否则请改用 double
。这也意味着您需要确保分配的内存至少 sizeof (double)
字节宽。
我已经声明了一个字符串并使用 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)
字节视为 double
1:
*(double *)str = strtod( str, NULL );
基本上,我们将 str
视为 double
对象的地址,并将 strtod
的结果分配给它。要访问该 double
值,您需要再次转换:
printf( "value stored in str = %f\n", *(double *) str );
现在,这意味着我们已经用 double
值覆盖了字符串的前 sizeof (double)
个字节,因此您丢失了原始字符串值。如果您需要在保留原始字符串值的同时将其视为浮点值,那么您 必须 使用单独的对象来执行此操作。 C 不是 Python 或 Javascript,并且值不会根据上下文神奇地改变它们的表示。
- 除非您真的受限于内存或有特定原因要使用
float
,否则请改用double
。这也意味着您需要确保分配的内存至少sizeof (double)
字节宽。