【问题标题】:Why does casting with a pointer require casting on the right side of the assignment (=)?为什么用指针进行转换需要在赋值的右侧进行转换 (=)?
【发布时间】:2022-11-30 05:34:45
【问题描述】:

正确方法:

int *x = (int *) malloc(sizeof(int) * 5);
void *x = (int *) malloc(sizeof(int) * 5);

不正确的方式:

int *x (int *) = malloc(sizeof(int) * 5);

这种语法的原因是什么?因为指针是迭代的指针,所以不应该对它进行强制转换(这样它就知道要迭代多少字节)?

【问题讨论】:

  • malloc 返回 void *。您告诉编译器将 void * 视为 int *,因此它与 malloc 一起处理。
  • 您转换 malloc 的返回值,然后将转换的结果分配给 x。分配的值在 = 的右侧,因此,强制转换属于那里。
  • 所以它知道要迭代多少字节不确定那是什么意思。
  • C没有需要铸造右侧。不管怎样,第二个例子是矛盾的:malloc返回void*那么你为什么要把它转换成int*来分配给void *x

标签: c pointers casting


【解决方案1】:

首先是一个狡辩:代码中的 = 字符表示初始化,而不是赋值。语义是相似的,至少在这种情况下是这样。

在赋值的左侧强制转换是没有意义的。

强制转换运算符采用某种类型的操作数并产生某种(其他)类型的值。

将转换运算符视为类似于函数调用的东西可能会有所帮助。假设您有一个名为convert_value 的函数。写是有意义的:

some_type target_object = convert_value(foo);

或者

some_type target_object;
target_object = convert_value(foo);

没有合理的方式用赋值左侧的函数调用来表达这一点。左侧表示一个对象,而不是一个值;强制转换产生一个值。

(你可以有一个演员部分表达式左侧的名称,但不在顶层。)

在这种特殊情况下,不需要强制转换。而不是

int *x = (int *) malloc(sizeof(int) * 5);

最好这样写:

int *x = malloc(5 * sizeof *x);

赋值或初始化会将void*值隐式转换为目标指针类型,而sizeof *x样式意味着您不必重复类型名称(这很容易出错,特别是如果稍后修改代码).

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多