3

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

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

(int *) 是什么意思,当你执行上面的代码时到底发生了什么?

4

6 回答 6

9

(int *)是所谓的强制转换运算符。它用于将运算符右侧的值转换为括号中的类型。

在这里,它用于将void *返回的指针转换malloc()为 an int *,即指向整数的指针。

这是一个非常糟糕的用法,你不应该这样做

于 2012-11-28T15:50:06.637 回答
3

malloc有返回类型void*,它读作pointer-to-void,意思是指向某物的指针。

p有 type int*,所以是指向 int 的指针。为了分配mallocinto的结果p,您需要以某种方式转换int*void*

如果你写:

int* p = malloc(...)

转换自动发生(“隐式转换”)。

如果你出于某种原因决定写:

int* p = (int*) malloc(...)

结果是相同的,但转换是显式的(即“强制转换”)。

于 2012-11-28T15:51:39.227 回答
1

试试这个链接man malloc

在C中,不需要类型转换,malloc所以直接写

p = malloc(sizeof(int));

仅供参考,这(int *)不过是类型转换。由于许多函数返回void* ,因此它需要在各自的类型中进行类型转换,以便进一步使用指针进行操作。

在 malloc 的情况下,它会被隐式处理

(type)在 C 中称为类型转换运算符。

假设例如,

int a;
float b = 11.4;

您想输入bin的整数值a。使用类型转换

a = (int)b

于 2012-11-28T15:50:31.133 回答
1

这是关于 malloc 的文档。

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

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

于 2012-11-28T15:53:07.060 回答
1
int *p;  // pointer to an integer
p = (int *) malloc(sizeof(int)); // assignment of enough memory for an integer

(int *)部分称为类型转换,您是在告诉编译器:

“我知道 malloc() 给了我一个 void *,但我要把它分配给别的东西”。

类型转换有一些有用的理由,但它也可能很危险。在这种情况下,因为malloc()返回 avoid *您不需要进行类型转换,因为它会自动安全地转换为其他指针类型。

于 2012-11-28T15:58:14.703 回答
1

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呼叫仍然是更好的风格。

于 2012-11-28T16:40:22.230 回答