【问题标题】:Type casting an array of pointers when using malloc使用 malloc 时类型转换指针数组
【发布时间】:2021-12-25 08:51:05
【问题描述】:

当我运行以下程序时,它执行得很好:

int *a, i=3;
int **arr;
a = &i;
arr = malloc(sizeof(int*));
arr[0] = a;

但是,malloc 返回一个 void* 指针,因此对它进行类型转换会更漂亮。我试过(int*)malloc(sizeof(int*)),但收到警告:

来自不兼容指针类型的赋值

指向类型转换的行(特别是等号)。 具体案例的正确类型是什么?提前谢谢!

【问题讨论】:

  • 应该是(int **)

标签: c pointers malloc typecasting-operator


【解决方案1】:

一般来说,如果您要分配T 类型的对象,那么 malloc 调用的返回指针应强制转换为T * 类型。

例如

T *p = ( T * )malloc( sizeof( T ) );

也就是说你要获取一个指向T类型的对象的指针,所以得到的指针的类型是T *

如果对象具有例如int * 类型,则相应的指针将具有int ** 类型。

在 C 中,指向 void 类型的指针可以分配给任何其他对象类型的指针,而无需强制转换。有时 C 中的强制转换用于自记录或避免某些类型的错误。

【讨论】:

  • @EricPostpischil 对不起。我错过了对象这个词。
【解决方案2】:

您应该使用int**,而不是int*,因为arr 的类型是int**

请注意,更好的分配模式是:

arr = malloc(sizeof *arr);

它对arr 类型的变化是健壮的。此外,它结构紧凑,避免重复。它将自动检测arr 是否更改为数组或非ponter。分配的大小也会自动调整。

malloc 的主要问题不是返回类型,而是确保分配正确的字节数。

【讨论】:

    【解决方案3】:

    类型应该与您分配的指针相同。由于您分配给int **arr,因此您应该转换为int **

    arr = (int **)malloc(sizeof(int*));
    

    但是,一般不建议将malloc()的结果转换成C语言。原因见Do I cast the result of malloc?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多