我正在学习 C 语言我需要一些关于代码段的解释,
int *p;
p = (int *) malloc(sizeof(int));
(int *) 是什么意思,当你执行上面的代码时到底发生了什么?
我正在学习 C 语言我需要一些关于代码段的解释,
int *p;
p = (int *) malloc(sizeof(int));
(int *) 是什么意思,当你执行上面的代码时到底发生了什么?
(int *)
是所谓的强制转换运算符。它用于将运算符右侧的值转换为括号中的类型。
在这里,它用于将void *
返回的指针转换malloc()
为 an int *
,即指向整数的指针。
这是一个非常糟糕的用法,你不应该这样做。
malloc
有返回类型void*
,它读作pointer-to-void,意思是指向某物的指针。
p
有 type int*
,所以是指向 int 的指针。为了分配malloc
into的结果p
,您需要以某种方式转换int*
为void*
。
如果你写:
int* p = malloc(...)
转换自动发生(“隐式转换”)。
如果你出于某种原因决定写:
int* p = (int*) malloc(...)
结果是相同的,但转换是显式的(即“强制转换”)。
试试这个链接man malloc
在C中,不需要类型转换,malloc
所以直接写
p = malloc(sizeof(int));
仅供参考,这(int *)
不过是类型转换。由于许多函数返回void*
,因此它需要在各自的类型中进行类型转换,以便进一步使用指针进行操作。
在 malloc 的情况下,它会被隐式处理
(type)
在 C 中称为类型转换运算符。
假设例如,
int a;
float b = 11.4;
您想输入b
in的整数值a
。使用类型转换
a = (int)b
这是关于 malloc 的文档。
您正在分配一个 int 大小的内存块(此值可能会根据系统/编译器组合而变化)。
(int *) 将右侧转换为 int *,这在 C 中不是必需的,您只需要 malloc。
int *p; // pointer to an integer
p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer
这(int *)
部分称为类型转换,您是在告诉编译器:
“我知道 malloc() 给了我一个 void *,但我要把它分配给别的东西”。
类型转换有一些有用的理由,但它也可能很危险。在这种情况下,因为malloc()
返回 avoid *
您不需要进行类型转换,因为它会自动安全地转换为其他指针类型。
Unwind 已经给了你答案,但我想稍微扩展一下。
在 C 中,有些类型是不兼容的;您不能直接将 type 的值分配给 typeT
的变量Q
;例如,您不能将指针分配给int
类型指针指向的变量double
:
double *q;
int *p;
...
q = p; // will cause a diagnostic to be issued
但是,如果您确实需要进行该分配,则可以使用强制转换表达式,它将值转换为目标类型:
q = (double *) p;
这告诉编译器将 的值转换为指向的p
指针double
并将结果分配给q
.
在 C 的原始 K&R 版本中,malloc
返回了char *
,因此如果要将结果分配给malloc
不同类型的指针,则必须应用强制转换:
int *p = (int *) malloc(SIZE);
这在 1989 年发生了变化,当时引入了第一个 C 标准。该版本引入了一种void *
类型来充当“通用”指针类型。type 的值void *
可以直接分配给其他指针类型,而不需要强制转换。因此,从 C89 及更高版本开始,您可以简单地编写
int *p = malloc(SIZE);
这不仅更清洁,而且更安全;如果您忘记包含stdlib.h
或没有malloc
在范围内的声明,编译器将假定malloc
返回一个int
值并相应地生成代码。由于int
无法将值直接分配给指针类型,因此您将获得诊断。但是,如果您添加了演员表,则该警告将被禁止,并且您可能会在运行时遇到问题。
1999 年的标准摆脱了隐含的int
假设,因此这不再是一个真正的危险,但放弃malloc
呼叫仍然是更好的风格。