使用 malloc 时类型转换指针数组

Type casting an array of pointers when using malloc

当我是运行下面的程序时,它执行得很好:

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

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

assignment from incompatible pointer type

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

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

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

但是,一般不建议将malloc()的结果用C进行强制转换,原因见Do I cast the result of malloc?

一般来说,如果您正在分配一个 T 类型的对象,那么 malloc 调用的返回指针应该被转换为 T *.

类型

例如

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

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

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

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

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

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

arr = malloc(sizeof *arr);

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

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