C语法说明

时间:2012-11-28 15:48:28

标签: c

嘿伙计们,我正在学习C语言我需要一些关于代码段的解释,

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

当您执行上述代码时,(int *)意味着什么,以及最新的事情。

6 个答案:

答案 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)

Here's关于malloc的文档。

你正在分配一个int大小的内存块(这个值可能会根据系统/编译器组合而改变)。

(int *)将右侧转换为int *,这在C中是不必要的,你只需要malloc。

答案 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}}调用离开演员阵容仍然是更好的风格。