关于malloc()前是否需要类型转换,即void*转换为具体类型

之前在Stack OverFlow上贴了段代码,求帮忙找bug,意外的收获了关于malloc()前是否需要类型转换的一些说法,很涨姿势,贴出来大家共享

you don’t cast the result, since:
- It is unnecessary, as void * is automatically and safely promoted to any other pointer type in this case.
- It adds clutter to the code, casts are not very easy to read (especially if the pointer type is long).
- It makes you repeat yourself, which is generally bad.
- It can hide an error, if you forgot to include <stdlib.h>.
This can cause crashes (or, worse, not cause a crash until way later in some totally different part of the code). Consider what happens if pointers and integers are differently sized; then you’re hiding a warning by casting and might lose bits of your returned address. Note: as of C11 implicit functions are gone from C, and this point is no longer relevant since there’s no automatic assumption that undeclared functions return int.
As a clarification, note that I said “you don’t cast”, not “you don’t need to cast”. In my opinion, it’s a failure to include the cast, even if you got it right. There are simply no benefits to doing it, but a bunch of potential risks, and including the cast indicates that you don’t know about the risks.

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误通常是因为你尝试将一个 `void*` 类型的指针转换成一个非指针类型的变量。例如,下面的代码就会产生这个错误: ```c++ void* ptr = malloc(sizeof(int)); int val = (int)ptr; // 错误:将指针转换为整数类型 ``` 在这个例子中,`ptr` 是一个 `void*` 类型的指针,指向一个整数类型的内存空间。然而,当我们试图将它转换为 `int` 类型的变量 `val` 时,编译器会报错,因为这样的转换是无效的。 如果你想将一个 `void*` 类型的指针转换成一个特定的指针类型,例如 `mybuffer*`,你需要使用显式类型转换: ```c++ void* ptr = malloc(sizeof(mybuffer)); mybuffer* buffer = (mybuffer*)ptr; // 显式类型转换 ``` 在这个例子中,我们使用了 `(mybuffer*)` 将 `void*` 类型的指针转换成了 `mybuffer*` 类型的指针。请注意,这种转换可能会导致未定义行为,因此你需要确保你的代码能够正确处理它们。 ### 回答2: 从类型void*’到类型‘mybuffer*’的转换无效,意味着无法直接将一个指向void类型的指针转换为指向mybuffer类型的指针。 在C语言中,void指针是一种泛型指针,可以用来指向任意类型的数据,但由于其没有具体类型信息,因此无法直接进行解引用操作。而mybuffer*是一个特定类型的指针,它指向mybuffer类型的对象。 要实现从void*到mybuffer*的转换需要进行强制类型转换,并确保被转换void指针实际上指向的是mybuffer类型的对象。 例如,假设有以下代码段: void* voidPtr; mybuffer* bufferPtr; // 假设 voidPtr 指向一个 mybuffer 类型的对象 bufferPtr = (mybuffer*)voidPtr; 这里使用了强制类型转换,将void指针voidPtr转换为mybuffer指针bufferPtr。但是,这种转换实际上只是告诉编译器如何解释指针的类型,而不会进行实际的数据转换。因此,如果voidPtr指向的实际对象不是mybuffer类型,那么此转换将是无效的,可能导致运行时错误。 要避免这种类型转换无效的情况,需要在进行类型转换,确保void指针指向的对象与目标类型相兼容。可以通过在赋值之进行类型检查或使用其他方式来确保类型转换的有效性。 ### 回答3: 从类型 'void*' 到类型 'mybuffer*' 的转换是无效的。这是因为 'void*' 是一个通用指针类型,它可以指向任何类型的数据,但不能直接解引用。而 'mybuffer*' 是指向 mybuffer 类型对象的指针,它具有特定的大小和内存布局。因此,从 'void*' 到 'mybuffer*' 的转换需要进行强制类型转换。 强制类型转换可以通过将 'void*' 指针转换为 'mybuffer*' 指针来实现,例如: ``` void* vptr; mybuffer* buffer = static_cast<mybuffer*>(vptr); ``` 在进行强制类型转换时,我们需要确保 'void*' 指针所指向的实际对象的类型与目标指针类型 'mybuffer*' 相匹配。如果类型不匹配,转换就是无效的,可能导致未定义的行为或错误的结果。 为了避免这种转换问题,我们可以在代码中尽量避免使用 'void*' 类型,并尽可能使用更具体的指针类型。这样可以增加代码的可读性和可维护性,并减少潜在的错误。如果必须使用 'void*' 类型,务必进行有效的类型检查和转换操作,以确保代码的正确性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值