在一些代码片段中,我看到了malloc()转换为(char *)等(int *)。为什么要这样做?
例如:
char *p;
p = (char *) malloc(100 * sizeof(char));
在一些代码片段中,我看到了malloc()转换为(char *)等(int *)。为什么要这样做?
例如:
char *p;
p = (char *) malloc(100 * sizeof(char));
在恐龙时代,C 没有
void *. 通用指针的想法void *很晚才出现在 C 中(不是来自任何地方,而是来自 C++)。直到那个时候,它被用作“通用”指针类型char *。该函数malloc返回类型为 的结果char *。在那些日子里,需要将结果malloc从char *指针接收器的特定类型进行隐式转换。在使用准标准 C 编写的代码示例中,包括 K&R 的第一个版本,正是由于这个原因,这种转换无处不在。随着类型
void *隐式转换为任何指针类型的语言出现,以及随后转换malloc为void *,显式转换的需求已经消失。但是,它仍然可以在很多旧代码中看到。这种转换也迁移到了在第一个 C 标准出现之前编写的 K&R C 的第二版。它。结果,使用K&R书学习的学生从那里“养成”了这种奇怪的习惯,盲目地将其视为“货物崇拜”。在现代 C 代码中,这种转换仅在交叉编译的 C-C++ 代码中才有意义,因为 在 C++ 中,指向
void *其他类型的指针本身不会强制转换。特别是,例如,在头文件中实现交叉编译的宏和内联函数时。(在现代语言规范中使用类型作为 C
char *中的泛型指针的遗留问题是保证对象表示和类型对齐要求void *必须char *匹配。)公平地说,应该注意的是,现代爱好者的一个论点是明确地
malloc在 C 代码中呈现结果(不打算用于交叉编译)仍然包含一定的理性颗粒。在像这样的代码中如果有人将声明中的指针类型
p从T *to 更改U *,但忘记修复内存分配 via ,则编译器将生成有关malloc调用中指针类型不匹配的诊断消息。malloc是的,这是真的。但是,防止此类问题的一种更智能的方法是使用具有“类型无关”内存分配的习语
它本身将“自动”适应上述类型更改。
该函数
malloc分配参数中传递的大小的内存块,并返回指向已分配块的第一个字节的指针。返回类型(void*)- 指向某些数据的指针,无类型指针分配的内存块被分配给具有确切类型的指针。因此,我们必须显式地转换
(void*)为我们分配给这个块的指针的类型。需要注意的是,
如果您使用 C++ 编译器编译程序,则必须进行显式转换。
如果您使用 C 编译器编译程序,则可以省略显式转换。
同意前面的发言者的观点,我将表达我的煽动性想法——因为许多人设法将 C 视为类似于阉割的 C++,并以 C++ 模式编译 C 程序。而且他需要演员...
所以所有这些转换只是一个噱头,所以编译器不会发誓,这已经成为一种习惯 :)
是的,它并没有那么糟糕——至少你可以看到
malloc内存的确切分配。