嘿伙计们,我正在学习C语言我需要一些关于代码段的解释,
int *p;
p = (int *) malloc(sizeof(int));
当您执行上述代码时,(int *)意味着什么,以及最新的事情。
答案 0 :(得分:9)
(int *)
是一个所谓的强制转换运算符。它用于将运算符右侧的值转换为括号中的类型。
这里,它用于将void *
返回的malloc()
指针转换为int *
,即指向整数的指针。
这是一个非常糟糕的用法,you should not do it。
答案 1 :(得分:3)
malloc
具有返回类型void*
,其读取为指向void的指针,这意味着指向某事物。
p
的类型为int*
,因此指向int。要将malloc
的结果分配到p
,您需要以某种方式将int*
转换为void*
。
如果你写:
int* p = malloc(...)
转换自动发生(“隐式转换”)。
如果您出于某种原因决定写:
int* p = (int*) malloc(...)
结果相同,但转换是明确的(即“强制转换”)。
答案 2 :(得分:1)
试试此链接man malloc
在C中,malloc
不需要进行类型转换,所以直接写
p = malloc(sizeof(int));
仅供参考,这个(int *)
只不过是一个类型。由于许多函数返回void*
所以它需要在各自的类型中进行类型转换,以便用指针进行进一步的操作。
在malloc的情况下,它被隐含地照顾
(type)
在C中称为类型转换运算符。
例如,假设
int a;
float b = 11.4;
您希望将b
的整数值放在a
中。使用类型转换
a = (int)b
答案 3 :(得分:1)
答案 4 :(得分:1)
int *p; // pointer to an integer
p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer
(int *)
部分称为类型转换,您告诉编译器:
“我知道malloc()给了我一个空白*,但我要把它分配给别的东西”。
对于类型转换有一些有用的理由,但它也可能是危险的。在这种情况下,由于malloc()
返回void *
,因此您无需进行类型转换,因为它会自动安全地转换为其他指针类型。
答案 5 :(得分:1)
放松已经给了你答案,但我想稍微扩展它。
在C中,某些类型不是兼容的;您无法直接将T
类型的值分配给Q
类型的变量;例如,您不能将指向int
的指针指定给指向double
的类型指针的变量:
double *q;
int *p;
...
q = p; // will cause a diagnostic to be issued
但是,如果您确实需要进行该分配,则可以使用强制转换表达式,将值转换为目标类型:
q = (double *) p;
这告诉编译器将p
的值转换为指向double
的指针,并将结果赋给q
。
在原版K& R版C中,malloc
返回char *
,因此如果您想将malloc
的结果分配给不同类型的指针,那么申请演员:
int *p = (int *) malloc(SIZE);
1989年,当第一个C标准出台时,情况发生了变化。该版本引入了void *
类型作为“通用”指针类型。类型void *
的值可以直接分配给其他指针类型,而无需强制转换。因此,从C89及更高版本开始,您只需编写
int *p = malloc(SIZE);
这不仅更清洁,而且更安全;如果您忘记包含stdlib.h
或者在范围内没有malloc
声明,编译器会假设malloc
返回int
值并相应地生成代码。由于无法将int
值直接分配给指针类型,因此您将获得诊断。但是,如果添加了强制转换,则会禁止该警告,并且您可能在运行时遇到问题。
1999年的标准摆脱了隐含的int
假设,因此不再是一个真正的危险,但是让{@ 1}}调用离开演员阵容仍然是更好的风格。