纠正道:
int *x = (int *) malloc(sizeof(int) * 5); void *x = (int *) malloc(sizeof(int) * 5);
不正确的方式:
int *x (int *) = malloc(sizeof(int) * 5);
这种语法的原因是什么?因为指针是迭代的指针,所以不应该向它强制转换(这样它就知道要迭代多少字节)吗?
lf5gs5x21#
先是狡辩:代码中的=字符表示初始化,而不是赋值。至少在本例中,语义是相似的。在赋值语句的左侧进行强制转换是没有意义的。转换运算符接受某种类型的操作数,并生成某种(其他)类型的值。把强制转换操作符想象成类似于函数调用的东西可能会有所帮助。假设你有一个名为convert_value的函数。这样写是有意义的:
=
convert_value
some_type target_object = convert_value(foo);
或
some_type target_object; target_object = convert_value(foo);
在赋值语句的左边用函数调用来表达这一点是不合理的,左边表示一个对象,而不是一个值;强制转换将产生一个值。(You可以将转换为表达式左侧名称的 * 一部分 *,但不能转换为顶级名称。)在这个特殊的例子中,不需要强制转换。
int *x = (int *) malloc(sizeof(int) * 5);
最好是这样写:
int *x = malloc(5 * sizeof *x);
赋值或初始化会隐式地将void*值转换为目标指针类型,而sizeof *x样式意味着您不必重复类型名称(这可能容易出错,尤其是在以后修改代码时)。
void*
sizeof *x
1条答案
按热度按时间lf5gs5x21#
先是狡辩:代码中的
=
字符表示初始化,而不是赋值。至少在本例中,语义是相似的。在赋值语句的左侧进行强制转换是没有意义的。
转换运算符接受某种类型的操作数,并生成某种(其他)类型的值。
把强制转换操作符想象成类似于函数调用的东西可能会有所帮助。假设你有一个名为
convert_value
的函数。这样写是有意义的:或
在赋值语句的左边用函数调用来表达这一点是不合理的,左边表示一个对象,而不是一个值;强制转换将产生一个值。
(You可以将转换为表达式左侧名称的 * 一部分 *,但不能转换为顶级名称。)
在这个特殊的例子中,不需要强制转换。
最好是这样写:
赋值或初始化会隐式地将
void*
值转换为目标指针类型,而sizeof *x
样式意味着您不必重复类型名称(这可能容易出错,尤其是在以后修改代码时)。